删除字符串中出现次数最少的字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除字符串中出现次数最少的字符相关的知识,希望对你有一定的参考价值。

题目描述

实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

输入描述:

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

输出描述:

删除字符串中出现次数最少的字符后的字符串。

输入例子:
abcdd
输出例子:
dd


思路:(我的思路有点绕弯,先记录下来,后面有网友简洁思路),首先把字符串元素存入list中,继续以key-字符,value-出现次数存入map中,然后map按照value自然升序排序,然后取出map中value最小的对应的key放入另外一list中,则存储原始字母的list删去对应小的map中的key(已存在另一list),OK
 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.Comparator;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 import java.util.Map.Entry;
 8 import java.util.Scanner;
 9 
10 public class DelStr {
11 
12     public static void main(String[] args) {
13         Scanner sc = new Scanner(System.in);
14         while (sc.hasNextLine()) {
15             String s = sc.nextLine();
16             newStr(s);
17         }
18     }
19 
20     public static void newStr(String s) {
21         Map<String, Integer> map = new HashMap<String, Integer>();//key-字符,value-字符出现次数
22         List<String> li1 = new ArrayList<String>();//用来存储出现次数最少的元素
23         
24         List<String> li2 = new ArrayList<String>();//用来存储原始字符串
25         for (int i = 0; i < s.length(); i++) {
26             li2.add(String.valueOf(s.charAt(i)));
27         }
28         
29         for (int i = 0; i < s.length(); i++) {//把字符串存储map中,根据value用来寻找出现次数最少的字符
30             String key = String.valueOf(s.charAt(i));
31             if (!map.containsKey(key)) {
32                 map.put(key, 1);
33             } else {
34                 map.put(key, map.get(key) + 1);
35             }
36         }
37         
38         List<Map.Entry<String, Integer>> li = new ArrayList<Map.Entry<String, Integer>>(//把map.entrySet()准换为list元素
39                 map.entrySet());
40         
41         Collections.sort(li, new Comparator<Map.Entry<String, Integer>>() {//使用Collections工具类对list中的Map.Entry<String, Integer>类型元素进行value值升序排序
42             @Override
43             public int compare(Entry<String, Integer> o1,
44                     Entry<String, Integer> o2) {
45                 if (o1.getValue() < o2.getValue()) {
46                     return -1;
47                 } else if (o1.getValue() > o2.getValue()) {
48                     return 1;
49                 }
50                 return 0;
51             }
52 
53         });
54         
55         int flag = 0;//记录出现次数最少的元素个数
56         for (int i = 0; i < li.size() - 1; i++) {
57             int tem1 = li.get(i).getValue(), tem2 = li.get(i + 1).getValue();
58             if (tem1 != tem2) {
59                 break;
60             } else {
61                 flag += 1;
62             }
63         }
64         
65         for (int i = 0; i <= flag; i++) {//把出现次数最少的元素存储到li链表中
66             String s1 = li.get(i).getKey();
67             li1.add(s1);
68         }
69 
70         li2.removeAll(li1);//原始数据中移除出现次数最少的元素
71         
72         for (int i = 0; i < li2.size(); i++) {//输出更新后的元素
73             System.out.print(li2.get(i));
74         }
75         System.out.print("\n");
76     }
77 
78 }

实际上我的代码冗余而且多了不必要的步骤;下面是网友代码:


 1 import java.util.*;
 2 public class Main{
 3     public static void main(String [] args){
 4         Scanner in = new Scanner(System.in);
 5         String str = "";
 6         HashMap<Character,Integer> map;
 7         while(in.hasNext()){
 8             str = in.nextLine();
 9             StringBuffer sb = new StringBuffer();
10             map = new HashMap<Character,Integer>();
11             int Min = Integer.MAX_VALUE;
12             for(int i = 0;i<str.length();i++){
13                 char ch = str.charAt(i);
14                 if(map.containsKey(ch)){
15                     map.put(ch,map.get(ch) + 1);
16                 }else{
17                     map.put(ch,1);
18                 }
19             }
20             for( Integer value :map.values()){
21                 Min = Math.min(value,Min);
22             }
23             for(int i=0;i<str.length();i++){
24                 char ch = str.charAt(i);
25                 if(map.get(ch) != Min){
26                     sb.append(ch);
27                 }
28             }
29             System.out.println(sb.toString());
30         }
31     }
32 }

再贴一个

 1 import java.util.HashMap;
 2 import java.util.HashSet;
 3 import java.util.Scanner;
 4  
 5 public class Main {
 6     public static void main(String[] args) {
 7         Scanner console = new Scanner(System.in);
 8         HashMap<Character, Integer> map = new HashMap<>();
 9         HashSet<Character> charSet = new HashSet<>();
10         char[] charArr;
11         while (console.hasNext()) {
12             String inputStr = console.next();
13             charArr = inputStr.toCharArray();
14             for (int i = 0; i < charArr.length; i++) {
15                 charSet.add(charArr[i]);
16             }
17             for (char ch : charSet) {
18                 int temp = 0;
19                 for (int i = 0; i < charArr.length; i++) {
20                     if (ch == charArr[i]) {
21                         temp++;
22                     }
23                 }
24                 map.put(ch, temp);
25             }
26             int min = Integer.MAX_VALUE;
27             for(char ch : map.keySet()){
28                 int value = map.get(ch);
29                 if(value < min){
30                     min = value;
31                 }
32             }
33             StringBuilder result = new StringBuilder();
34             for (int i = 0; i < charArr.length; i++) {
35                 if (map.get(charArr[i]) != min)
36                     result.append(charArr[i]);
37                 else
38                     continue;
39             }
40             System.out.println(result);
41         }
42         console.close();
43     }
44 }

 



以上是关于删除字符串中出现次数最少的字符的主要内容,如果未能解决你的问题,请参考以下文章

华为机试:删除字符串中出现次数最少的字符

华为机试HJ23:删除字符串中出现次数最少的字符

算法基础:删除字符串中出现次数最少的字符(Golang实现)

华为机试-删除字符串中出现字符最少的字符python实现

算法分析---删除字符串中出现次数最少的字符

华为机试