| 题目 | 字符串统计 |
| 难度 | 易 |
| 题目说明 | 给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用,要求输出剩余可用字符集。 |
| 输入描述 | 1. 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集。 2. 已占用字符集中的字符,一定是全量字符集中的字符,字符集中的字符跟字符之间使用英文逗号隔开。 3. 每个字符都表示为字符加数字的形式,用英文冒号分隔,比如 a:1 标识 1 个 a 字符。 4. 字符只考虑英文字母,区分大小写,数字只考虑正整型 不超过100。 5. 如果一个字符都没被占用,@标识仍存在,例如 a:3,b:5,c:2@。 |
| 输出描述 | 输出可用字符集,不同的输出字符集之间用回车换行。 注意:输出的字符顺序要跟输入的一致,不能输出b:3,a:2,c:2。 如果某个字符已全部占用,则不需要再输出。 |
| 补充说明 | 无 |
| ------------------------------------------------------ | |
| 示例 | |
| 示例1 | |
| 输入 | a:3,b:5,c:2@a:1,b:2 |
| 输出 | a:2,b:3,c:2 |
| 说明 | 全量字符集为 3 个 a,5 个 b,2 个 c。 已占用字符集为 1 个 a,2 个 b。 由于已占用字符不能再使用,因此,剩余可用字符为 2 个 a,3 个 b, 2 个 c。 |
| 示例2 | |
| 输入 | a:3,b:5,c:2@ |
| 输出 | a:3,b:5,c:2 |
| 说明 | 没有占用任何字符,输出所有字符及其对应个数。 |
题目解读:
输入一个字符串,以 @ 隔开,@之前的是全量字符集,@之后是占用字符集。无论是全量字符集,还是占用字符集,每个字符及其个数以“字符:个数”的方式表示,不同的字符和个数之间用 , 隔开。如果 @ 后为空,则表示没有占用字符集。
输出剩下未占用的字符集,如果某个字符已经全部被占用,则不输出此字符。
分析与思路:
此题的关键在于解析。
1. 先以 @ 为分隔符解析字符串,@ 之前为全量字符集,@ 之后为占用字符集。
2. 对于 @ 之前的字符集,以 “,” 为分隔符号,分隔出 “字符:个数”的格式,然后以 “:” 为分隔符,分隔出字符和其个数,顺序存放到数组中 charSetList 中。
3. 以步骤 2 中相同的方式解析占用字符集,如果不存在则直接输出全量字符,退出。
4. 遍历占用字符集,找到其在全量字符集中的字母,更新其个数(全量个数 减去 占用个数)。
5. 顺序遍历全量字符集,如果某个字母的个数为 0,则忽略它。
Java代码
- import java.util.Scanner;
- import java.util.List;
- import java.util.ArrayList;
- import java.util.Map;
- import java.util.HashMap;
-
- /**
- * 字符串统计
- *
- * @since 2023.11.20
- * @version 0.1
- * @author Frank
- *
- */
- public class StringStat {
-
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- while (sc.hasNext()) {
- String input = sc.nextLine();
- processStringStat(input);
- }
-
- }
-
- private static void processStringStat(String input) {
- String ret = "";
- String[] charSet = input.split( "@" );
- if( charSet.length == 1 )
- {
- if( input.endsWith( "@" ))
- {
- ret = input.substring( 0, input.length() - 1 );
- }else
- {
- ret = input;
- }
- System.out.println( ret );
- return;
- }
-
- List
[] charSetList = new ArrayList[2]; - Map
[] charSetNumMap = new HashMap[2]; - for( int i = 0; i < 2; i ++ )
- {
- List
tmpCharSetList = new ArrayList(); - Map
tmpCharSetNumMap = new HashMap(); - String[] charNum = charSet[i].split( "," );
- for( int j = 0; j < charNum.length; j ++ )
- {
- String tmpCharNum = charNum[j];
- String[] eachItem = tmpCharNum.split( ":" );
- Character key = eachItem[0].charAt( 0);
- Integer value = Integer.parseInt( eachItem[1] );
- tmpCharSetList.add( key );
- tmpCharSetNumMap.put( key , value );
- }
- charSetNumMap[i] = tmpCharSetNumMap;
- charSetList[i] = tmpCharSetList;
- }
-
- for( int i = 0; i < charSetList[1].size(); i ++ )
- {
- Character tmpChar = charSetList[1].get( i );
- int count = charSetNumMap[0].get( tmpChar ) - charSetNumMap[1].get( tmpChar );
- charSetNumMap[0].put( tmpChar, count );
- }
-
- StringBuffer sb = new StringBuffer();
- for( int i = 0; i < charSetList[0].size(); i ++ )
- {
- Character tmpChar = charSetList[0].get( i );
- int count = charSetNumMap[0].get( tmpChar );
- if( count == 0 )
- {
- continue;
- }
- sb.append( tmpChar + ":" + count + ",");
- }
- ret = sb.toString();
- if( ret.length() >= 1 )
- {
- ret = ret.substring( 0, ret.length() - 1 );
- }
-
- System.out.println( ret );
- }
-
- }
JavaScript代码
- const rl = require("readline").createInterface({ input: process.stdin });
- var iter = rl[Symbol.asyncIterator]();
- const readline = async () => (await iter.next()).value;
- void async function() {
- while (line = await readline()) {
- processStringStat(line);
- }
- }();
-
- function processStringStat( input ) {
- var ret = "";
- var charSetArray = input.split( "@" );
- if( charSetArray.length == 1 || charSetArray[1].length == 0)
- {
- if( input.endsWith( "@" ))
- {
- ret = input.substring( 0, input.length - 1 );
- }else
- {
- ret = input;
- }
- console.log( ret );
- return;
- }
-
- var charSetList = new Array();
- var charSetNumMap = new Map();
- for( var i = 0; i < 2; i ++ )
- {
- var tmpCharSetList = new Array();
- var tmpCharSetNumMap = new Map();
- var charNum = charSetArray[i].split( "," );
- for( var j = 0; j < charNum.length; j ++ )
- {
- var tmpCharNum = charNum[j];
- var eachItem = tmpCharNum.split( ":" );
- var key = eachItem[0];
- var value = parseInt( eachItem[1] );
- tmpCharSetList.push( key );
- tmpCharSetNumMap.set( key , value );
- }
- charSetNumMap[i] = tmpCharSetNumMap;
- charSetList[i] = tmpCharSetList;
- }
-
- for( var i = 0; i < charSetList[1].length; i ++ )
- {
- var tmpChar = charSetList[1][i];
- var count = charSetNumMap[0].get( tmpChar ) - charSetNumMap[1].get( tmpChar );
- charSetNumMap[0].set( tmpChar, count );
- }
-
- for( var i = 0; i < charSetList[0].length; i ++ )
- {
- var tmpChar = charSetList[0][ i ];
- var count = charSetNumMap[0].get( tmpChar );
- if( count == 0 )
- {
- continue;
- }
- ret += ( tmpChar + ":" + count + "," ) ;
- }
- if( ret.length >= 1 )
- {
- ret = ret.substring( 0, ret.length - 1 );
- }
-
- console.log( ret );
- }
(完)