题目:
- 题目描述:实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
- 输入输出:
- 输入:字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
- 输出:删除字符串中出现次数最少的字符后的字符串。
例子:
输入: abcdd 输出: dd
思路:对输入字符串进行排序,找出出现次数最少的字符(注意:可能出现好几个字符都是出现次数最少的)
将原字符串中的这些字符替换为”“因为key不能重复,导致相同key对应的value被覆盖了 后来就直接换成用两个三个变量来进行记录 deleteStr记录待删除的字符,count记录某个字符出现的次数,min则记录当前最少的次数。比较count和min来更新min一集deleteStr
代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String value = scan.next();
char[] copy = value.toCharArray();
Arrays.sort(copy);
int count = 1;
String deleteStr = "";
LinkedHashMap<Integer,String> map = new LinkedHashMap<>();
int min = Integer.MAX_VALUE;
for(int i = 0; i < copy.length-1; i++){
char ch = copy[i];
while(i < copy.length-1 && ch == copy[i+1]){
count++;
i++;
}
if(count < min){
min = count;
deleteStr = ch + "";
}else if(count == min){
deleteStr += ch;
}
if(i == copy.length-2 && ch != copy[i+1]){
count = 1;
ch = copy[i+1];
if(count < min){
min = count;
deleteStr = ch + "";
}else if(count == min){
deleteStr += ch;
}
}
count = 1;
}
String result = "";
for(int i = 0; i < deleteStr.length(); i++){
result = value.replaceAll(String.valueOf(deleteStr.charAt(i)),"");
value = result;
}
System.out.println(value);
}
}
}
上述代码虽然被AC了,但是明显很冗余,对代码进行改进
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String value = scan.next();
char[] copy = value.toCharArray();
String deleteStr = "";
HashMap<Character,Integer> map = new HashMap<>();
for(int i = 0; i < copy.length-1; i++){
char ch = copy[i];
if(map.containsKey(ch)){
map.put(ch,map.get(ch)+1);
}else{
map.put(ch,1);
}
}
String result = "";
Collection<Integer> val = map.values();
int min = Collections.min(val);
for(int i = 0; i < copy.length; i++){
if(map.get(copy[i]) != min){
result = result + copy[i];
}
}
System.out.println(result);
}
}
}
- 延伸:对于Map的排序,如果希望对key进行排序,则可直接用TreeMap;如果希望对value进行排序,则可利用Collections.sort(List list, Comparator<>)进行排序
- 具体实现如下:
HashMap<Integer,Integer> map = new HashMap<>();
List<MapEntry<Integer,Integer>> list = new ArrayList<>();
Collections.sort(list, new Comparator<MapEntry<Integer,Integer>>(){
public int compare(Map.Entry<String, Integer> o1,
Map.Entry<String, Integer> o2) {
return (o2.getValue() - o1.getValue());
}
});