字符串统计

题目部分

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

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BananaPi BPI-M6(Raspberry Pi 5) Android 平板电脑镜像测试温度

我已经在本文中介绍了 全新的Banana Pi BPI-M6&#xff0c;并讨论了其与Raspberry Pi 5的硬件特性比较。 然后我将 Android 平板电脑固件上传到 eMMC&#xff0c;从而使 Banana Pi 实际可用。一开始有点坎坷&#xff0c;但文章中有更多内容。 在另一台电脑上&#xff0c;一切都…

Arcgis小技巧【16】:ArcMap的那些功能在ArcGIS Pro里都去哪儿了?

有部分小伙伴现在已经用上了ArcGIS Pro&#xff0c;但可能还会有些不习惯。 一个很重要的原因&#xff0c;原来在ArcMap中的一些功能&#xff0c;好像在Pro里消失了。 不排除一些功能确实被移除了&#xff0c;但大部分其实是因为UI的变化&#xff0c;给放在了别的地方。 这里…

Linux CentOS7配置网络参数

CentOS6及以前版本中主要使用ifconfig工具&#xff0c;查看、配置网络参数。后来对推荐使用ip命令查看配置网络参数。而centos7中&#xff0c;不再赞成使用ifconfig工具&#xff0c;取而代之的是nmcli工具&#xff0c;服务管理也是以systemctl工具取代了service,这些之前版本的…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十二)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

学霸教你自学人工智能

在这个信息爆炸的时代&#xff0c;人工智能已经渗透到我们生活的方方面面。无论是语音助手、自动驾驶汽车&#xff0c;还是医疗诊断&#xff0c;人工智能都在发挥着越来越重要的作用。如果你对人工智能充满热情&#xff0c;希望在这个领域有所建树&#xff0c;那么&#xff0c;…

基于深度学习的视觉三维重建研究总结

参考连接&#xff1a; 基于深度学习的视觉三维重建研究总结 - 知乎

微信私域运营工具CRM

为什么要做微信私域&#xff1f; 客户在哪里&#xff1f;微信&#xff01;在中国&#xff0c;不论男女老少&#xff0c;90%的人每天使用微信至少5次&#xff0c;每次使用时间超过90分钟&#xff0c;已经成为像吃饭穿衣一样的生活必需品。因此&#xff0c;我们的目标客户就在微…

【github】初学者使用指南

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

简单选择排序

目录 基本原理举例示例代码总结简单选择排序 VS 堆排序简单选择排序 VS 冒泡排序 本文主要介绍简单选择排序的基本原理、具体例子&#xff0c;以及代码实现。 基本原理 简单选择排序的基本原理是&#xff1a; 在未排序序列中找到最小&#xff08;大&#xff09;元素&#xf…

一个奇怪的蓝牙模块分析记录

蓝牙标识PZ-BT11 从这个蓝牙通电后的表现可以看到有2个蓝牙&#xff0c;其中一个带有BLE标识&#xff0c;可能是一个双模蓝牙 首先这不是一个普通的JDY蓝牙&#xff0c; 因为普通JDY蓝牙只有1个蓝牙信号&#xff08;从手机搜索蓝牙&#xff09; 这可能是一个BLE蓝牙 因为B…

VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)

目录 一、服务器信息二、192.168.132.33主服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 …

Vue3 源码解读系列(七)——侦听器

侦听器 watch 侦听器是当侦听的对象或者函数发生了变化则自动执行某个回调函数。 侦听器的内部设计&#xff1a;侦听响应式数据的变化&#xff0c;内部创建 effect runner&#xff0c;首次执行 runner 做依赖收集&#xff0c;然后在数据发生变化后&#xff0c;以某种调度方式…

ESP32C3小飞控调试

ESP32C3小飞控调试 - 1 ESP32C3小飞控板赶在国庆节前发出打样&#xff0c;假期后上班就收到了样板&#xff0c;但是迟迟没有动手调试&#xff0c;这两天终于抽出时间调试了&#xff0c;调试过程还算顺利&#xff0c;基本没有遇到什么大问题&#xff0c;下面记录一下调试过程。…

什么是轻量应用服务器?腾讯云轻量服务器可以干什么?

腾讯云轻量应用服务器&#xff08;TencentCloud Lighthouse&#xff09;是新一代开箱即用、面向轻量应用场景的云服务器产品&#xff0c;轻量应用服务器可用于搭建中小型网站、Web应用、博客、论坛、小程序/小游戏、电商、云盘/图床、云端开发测试和学习环境等轻量级、中低负载…

微信可以注册小号啦,看看怎么操作

微信支持同一手机号绑定两个账号啦&#xff01; 生活号和工作号可以分开啦&#xff5e;实用又简单&#xff01; 详细步骤如下&#xff1a; ①点击微信-我的-设置 ②点击“切换账号” ③点击“添加账号” ④点击“注册新账号” ⑤点击“通过当前微信的手机号辅助注册” ⑥安…

《 机器人基础 》期末试卷(A)

一、填空题&#xff08;30分&#xff0c;每空2分&#xff09; 1. 按照相机的工作方式&#xff0c;机器人常用相机分为1&#xff09;__ 单目摄像头 2&#xff09;__ 双目摄像头 _ 3&#xff09;_深度摄像头_ 三类。 2. 度量地图强调…

建议收藏《Verilog代码规范笔记_华为》

华为verilog编程规范是坊间流传出来华为内部的资料&#xff0c;其贴合实际工作需要&#xff0c;是非常宝贵的资料&#xff0c;希望大家善存。至于其介绍&#xff0c;在此不再赘述&#xff0c;大家可看下图详细了解&#xff0c;感兴趣的可私信移知教育老师领取《Verilog代码规范…

超长圆钢在线直线度检测 告别手工测量时代

圆钢的直线度指的是它的表面形状是否呈现出直线。直线度是圆钢的重要品质要求之一&#xff0c;与其物理性能密切相关。在工业制造中&#xff0c;如果圆钢的直线度不达标&#xff0c;就会影响其后续的加工和使用效果&#xff0c;严重时甚至会造成损失。 超长圆钢的检测&#xff…

4-4有人写了一个函数

#include<stdio.h> int main(){int x,y;for(int i0;i<3;i){printf("输入x:");scanf("%d",&x);if(x<0){y(-1);printf("x%d的结果是y%d\n",x,y);}else if(x>0){y1;printf("x%d的结果是y%d\n",x,y);}else{y0;printf(&…

/main/binary-i386/Packages 404 File not found

在Ubuntu中使用本地源安装软件时提示以下错误&#xff1a; ......正在读取软件包列表... 完成 E: 无法下载 http://192.168.1.1:8000/dists/Jammy/main/binary-i386/Packages 404 File not found [IP: 192.168.1.1 8000] E: 无法下载 http://192.168.1.1:8000/dists/Jammy-upd…