笔试题目
输入描述
输入一个字符串,字符串中包含了全量字符集和已占用字符集,两个字符集用@相连。@前的字符集合为全量字符集,@后的字符集为已占用字符集合。已占用字符集中的字符一定是全量字符集中的字符。
字符集中的字符跟字符之间使用英文逗号分隔。字符集中的字符表示为字符加数字,字符跟数字使用英文冒号分隔,比如a:1,表示1个a字符。
字符只考虑英文字母,区分大小写,数字只考虑正整形,数量不超过100,如果一个字符都没被占用,@标识符仍在,例如a:3,b:5,c:2@
输出描述
可用字符集。输出带回车换行。
示例
输入: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。因此输出a:2,b:3,c:2。注意,输出的字符顺序要跟输入一致。不能输出b:3,a:2,c:2。如果某个字符已全被占用,不需要输出。例如a:3,b:5,c:2@a:3,b:2,输出为b:3,c:2。
我的代码
package s;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class sss {
//**输入**:a:3,b:5,c:2@a:1,b:2
//**输出**:a:2,b:3,c:2
public static void main(String[]args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//例子:输入:a:3,b:5,c:2@a:1,b:2
String[] strings = br.readLine().split("@");//切分输入 strings=[a:3,b:5,c:2 , a:1,b:2 ]
HashMap<String, Integer> map = new HashMap<>();//new 一个map存放分离出来的字符和字符个数
String[] split1 = strings[0].split(",");//先切分全量字符集,split1=[a:3 , b:5 ,c:2]
for(int i=0;i<split1.length;i++) {
//遍历全量字符集 ,将字符与其个数分别对应key和value 存入map
//map={a:3 , b:5 ,c:2}
map.put(split1[i].split(":")[0], Integer.valueOf(split1[i].split(":")[1]));
}
String[] split2 = strings[1].split(",");//切分用字符集split2=[a:1, b:2 ]
for(int i=0;i<split2.length;i++) {
map.put(split2[i].split(":")[0], map.get(split2[i].split(":")[0])-Integer.valueOf(split2[i].split(":")[1])); //更新map,map=[a:3-1 , b:5-2, c;2]
}
Set<Entry<String,Integer>> entrySet = map.entrySet();//读取map数据拼接字符串
Iterator<Entry<String, Integer>> it2 = entrySet.iterator();
String ss="";
while(it2.hasNext()){
Entry<String, Integer> entry = it2.next();
String key= entry.getKey();
Integer value = entry.getValue();
ss=ss+key+":"+value+",";
}
System.out.println(ss);//输出
}
}