华为机试练习 - 字符统计
题目:
如果统计的个数相同,则按照ASCII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
输入描述:
输入一串字符。
输出描述:
对字符中的
各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
2维排序,
按数量从大到小排
按asc码从小到大排
思路:
于是先存入ArrayList,利用字符本质是数字的特性,初始设为10万+ asc
然后每次有重复的-1000 (因为只统计数字和字符,char最大就100多)。
这样最后得到的是一个几万的数字, 前2位是100 - 数量(越多的数字越小),后面3位是asc。这样用TreeSet直接排序(组合的数字从小到大排序),即可完成数量从多到少,数量相同时asc码从小到大。
然后截取后3位转化为char输出即可。
import java.util.*; import static java.util.Collections.sort; public class Main{ public static void main(String[] args){ Scanner s = new Scanner(System.in); while(s.hasNext()) { ArrayList<Character> cAl = new ArrayList(); ArrayList<Integer> intAl = new ArrayList(); String str = s.nextLine(); char[] cArr = str.toCharArray(); for (int i = 0; i < cArr.length; i++) { char c = cArr[i]; if (c == '\0') { break; } boolean yn = false; if (c >= 'A' && c <= 'Z') { yn = true; } if (c >= 'a' && c <= 'z') { yn = true; } if (c >= '0' && c <= '9') { yn = true; } if (c == 0) { yn = true; } if (yn == true) { if (cAl.contains(c)) { int index = cAl.indexOf(c); int n = intAl.get(index); n = n - 10000; intAl.set(index, n); } else { cAl.add(c); intAl.add((int) c + 1000000); } } } TreeSet<Integer> ts = new TreeSet(intAl); for (Integer i : ts) { String temp = i.toString(); int l = temp.length(); temp = temp.substring(l - 4, l); System.out.print((char) Integer.parseInt(temp) + ""); } System.out.println(); } } }