题解 |HJ102 #字符统计#
字符统计
https://www.nowcoder.com/practice/c1f9561de1e240099bdb904765da9ad0
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char[] chars = str.toCharArray();
Map<Character, Integer> map = new HashMap<>();
// 样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a. 输出cda
//先将str按照ASCII大到小排序好再存进map
// char a = '0';
// for (int i = 0; i < chars.length; i++) {
// for (int j = i+1; j <chars.length ; j++) {
// if (chars[i]<chars[j]){
// //若右小于左则交换
// a = chars[j];
// chars[j] = chars[i];
// chars[i] = a;
// }
// }
// //此时map中是adc
// }
// System.out.println("排序以后 "+Arrays.toString(chars) );
for (int i = 0; i < chars.length; i++) {
map.put(chars[i], map.getOrDefault(chars[i], 0) + 1);
//此时map中是cda
}
// System.out.println(map);
// Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
//使用比较器按照value值进行倒序输出
ArrayList<Map.Entry<Character, Integer>> list = new
ArrayList<Map.Entry<Character, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1,
Map.Entry<Character, Integer> o2) {
//使用比较器按照value值进行倒序输出 o2.comp o1 就是倒序
int result = o2.getValue().compareTo(o1.getValue());
//result==0就是value值相等 其他情况为不相等
//value值相等时按照key值正序排序
return result == 0 ? o1.getKey() - o2.getKey() : o2.getValue() - o1.getValue();
}
});
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).getKey());
}
// System.out.println();
// 输出map看出map本身并未改变 改变的只是list中的顺序
// System.out.println(map);
// for (Map.Entry<Character, Integer> entry : entrySet) {
// System.out.print(entry.getKey());;
//// System.out.print(entry.getValue());
// }
}
}
本人解法中本题难点在于按照map的value值倒序输出且value值相等时按照Key值正序输出;
#华为机试#
查看1道真题和解析