题目部分
题目 | 字符串统计 |
难度 | 易 |
题目说明 | 给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用,要求输出剩余可用字符集。 |
输入描述 | 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<Character>[] charSetList = new ArrayList[2];Map<Character,Integer>[] charSetNumMap = new HashMap[2];for( int i = 0; i < 2; i ++ ){List<Character> tmpCharSetList = new ArrayList<Character>();Map<Character,Integer> tmpCharSetNumMap = new HashMap<Character, Integer>();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 );
}
(完)