删除字符串中出现次数最少的字符
题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于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 }