• 字符串统计


    题目部分

    题目字符串统计
    难度
    题目说明给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用,要求输出剩余可用字符集。
    输入描述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代码

    1. import java.util.Scanner;
    2. import java.util.List;
    3. import java.util.ArrayList;
    4. import java.util.Map;
    5. import java.util.HashMap;
    6. /**
    7. * 字符串统计
    8. *
    9. * @since 2023.11.20
    10. * @version 0.1
    11. * @author Frank
    12. *
    13. */
    14. public class StringStat {
    15. public static void main(String[] args) {
    16. Scanner sc = new Scanner(System.in);
    17. while (sc.hasNext()) {
    18. String input = sc.nextLine();
    19. processStringStat(input);
    20. }
    21. }
    22. private static void processStringStat(String input) {
    23. String ret = "";
    24. String[] charSet = input.split( "@" );
    25. if( charSet.length == 1 )
    26. {
    27. if( input.endsWith( "@" ))
    28. {
    29. ret = input.substring( 0, input.length() - 1 );
    30. }else
    31. {
    32. ret = input;
    33. }
    34. System.out.println( ret );
    35. return;
    36. }
    37. List[] charSetList = new ArrayList[2];
    38. Map[] charSetNumMap = new HashMap[2];
    39. for( int i = 0; i < 2; i ++ )
    40. {
    41. List tmpCharSetList = new ArrayList();
    42. Map tmpCharSetNumMap = new HashMap();
    43. String[] charNum = charSet[i].split( "," );
    44. for( int j = 0; j < charNum.length; j ++ )
    45. {
    46. String tmpCharNum = charNum[j];
    47. String[] eachItem = tmpCharNum.split( ":" );
    48. Character key = eachItem[0].charAt( 0);
    49. Integer value = Integer.parseInt( eachItem[1] );
    50. tmpCharSetList.add( key );
    51. tmpCharSetNumMap.put( key , value );
    52. }
    53. charSetNumMap[i] = tmpCharSetNumMap;
    54. charSetList[i] = tmpCharSetList;
    55. }
    56. for( int i = 0; i < charSetList[1].size(); i ++ )
    57. {
    58. Character tmpChar = charSetList[1].get( i );
    59. int count = charSetNumMap[0].get( tmpChar ) - charSetNumMap[1].get( tmpChar );
    60. charSetNumMap[0].put( tmpChar, count );
    61. }
    62. StringBuffer sb = new StringBuffer();
    63. for( int i = 0; i < charSetList[0].size(); i ++ )
    64. {
    65. Character tmpChar = charSetList[0].get( i );
    66. int count = charSetNumMap[0].get( tmpChar );
    67. if( count == 0 )
    68. {
    69. continue;
    70. }
    71. sb.append( tmpChar + ":" + count + ",");
    72. }
    73. ret = sb.toString();
    74. if( ret.length() >= 1 )
    75. {
    76. ret = ret.substring( 0, ret.length() - 1 );
    77. }
    78. System.out.println( ret );
    79. }
    80. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. processStringStat(line);
    7. }
    8. }();
    9. function processStringStat( input ) {
    10. var ret = "";
    11. var charSetArray = input.split( "@" );
    12. if( charSetArray.length == 1 || charSetArray[1].length == 0)
    13. {
    14. if( input.endsWith( "@" ))
    15. {
    16. ret = input.substring( 0, input.length - 1 );
    17. }else
    18. {
    19. ret = input;
    20. }
    21. console.log( ret );
    22. return;
    23. }
    24. var charSetList = new Array();
    25. var charSetNumMap = new Map();
    26. for( var i = 0; i < 2; i ++ )
    27. {
    28. var tmpCharSetList = new Array();
    29. var tmpCharSetNumMap = new Map();
    30. var charNum = charSetArray[i].split( "," );
    31. for( var j = 0; j < charNum.length; j ++ )
    32. {
    33. var tmpCharNum = charNum[j];
    34. var eachItem = tmpCharNum.split( ":" );
    35. var key = eachItem[0];
    36. var value = parseInt( eachItem[1] );
    37. tmpCharSetList.push( key );
    38. tmpCharSetNumMap.set( key , value );
    39. }
    40. charSetNumMap[i] = tmpCharSetNumMap;
    41. charSetList[i] = tmpCharSetList;
    42. }
    43. for( var i = 0; i < charSetList[1].length; i ++ )
    44. {
    45. var tmpChar = charSetList[1][i];
    46. var count = charSetNumMap[0].get( tmpChar ) - charSetNumMap[1].get( tmpChar );
    47. charSetNumMap[0].set( tmpChar, count );
    48. }
    49. for( var i = 0; i < charSetList[0].length; i ++ )
    50. {
    51. var tmpChar = charSetList[0][ i ];
    52. var count = charSetNumMap[0].get( tmpChar );
    53. if( count == 0 )
    54. {
    55. continue;
    56. }
    57. ret += ( tmpChar + ":" + count + "," ) ;
    58. }
    59. if( ret.length >= 1 )
    60. {
    61. ret = ret.substring( 0, ret.length - 1 );
    62. }
    63. console.log( ret );
    64. }

    (完)

  • 相关阅读:
    什么是GIL锁,有什么作用?python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型用多线程。
    内网信息收集
    (JVM)双亲委派机制
    express动态路由未能匹配造成的404问题
    程序员对代码注释可以说是又爱又恨又双标
    『贪吃蛇』AI 算法简易实现(中秋特别版)
    【Redis】一气呵成,带你了解Redis安装与连接
    spark常用的调参详解
    20231027 基于STM32mp157a 的内核与应用层通过子系统控制led灯,以及计时器功能
    JavaScript脚本操作CSS
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/134513944