描述
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
数据范围:输入的字符串长度满足 1≤n≤20 ,保证输入的字符串中仅出现小写字母
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
示例1
输入:
aabcddd
复制输出:
aaddd
我的原始代码,用时160ms, 消耗内存17428kb
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String in = scanner.next();HashMap<Character,Integer> map = new HashMap();for (int i = 0; i < in.length(); i++) {char ch = in.charAt(i);if(map.get(ch) == null){map.put(ch,1);}else{map.put(ch,map.get(ch)+1);}}List<Map.Entry<Character, Integer>> entryList = new ArrayList(map.entrySet());Collections.sort(entryList, new Comparator<Map.Entry<Character, Integer>>() {@Overridepublic int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {//正序排列,倒序反过来return o1.getValue() - o2.getValue();}});//遍历排序好的list,一定要放进LinkedHashMap,因为只有LinkedHashMap是根据插入顺序进行存储LinkedHashMap<Character, Integer> linkedHashMap = new LinkedHashMap<Character, Integer>();for (Map.Entry<Character,Integer> e : entryList) {linkedHashMap.put(e.getKey(),e.getValue());}Set<Character> integers = linkedHashMap.keySet();for (char c: integers){if(linkedHashMap.get((linkedHashMap.keySet().stream().findFirst()).get()) == linkedHashMap.get(c)){in = in.replaceAll(c+"","");}}System.out.println(in);
}
思路:
1.字符作为key,字符数作为value放入map中
2.排序
3.拿排序好的map取第一个值和其他作比较,相同则remove该字符
别人的39ms,10936kb
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String in = scanner.next();//统计各字符的数量HashMap<Character, Integer> map = new HashMap();for (int i = 0; i < in.length(); i++) {char ch = in.charAt(i);map.put(ch, map.getOrDefault(ch, 1) + 1);}//找最小的字符数Collection<Integer> values = map.values();Integer min = Collections.min(values);//通过最小字符数判断其他字符,并替换Set<Character> integers = map.keySet();for (char c : integers) {if (min == map.get(c)) {in = in.replaceAll(String.valueOf(c), "");}}System.out.println(in);
}
不得不说,代码简化了好几行
知识点总结:
1. map.getOrDefault(key,defaultvalue)方法的使用, 如果当前key没有对应的value,则取默认值,也就是该方法的1第二个参数,有的话则获取实际的值。
2.map.values()可以直接获取value的值集合,好久没用map给忘记了还先获取key然后通过key获取value
3.Collections集合工具类的min方法和max方法的使用,可以直接获取集合的最小值和最大值。
4. char类型转字符串类型用String.valueOf()比 直接拼接空字符串更好。
5.String是不可变的,replace之后还是得赋值给原引用,否则不会改变字符串的值。细节可参考:Java 中的 String的不可变性/Java中replace()深层理解/剑指offer替换空格理解_我是菜狗救救我的博客-CSDN博客
6.LinkedHashMap的默认实现是按插入顺序排序的