题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
输入例子:
abcdd
输出例子:
dd
import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String str = sc.nextLine();
char[] ch = str.toCharArray();
Map<Character,Integer> map = new TreeMap<>();
//遍历字符数组,统计每个字符出现的次数并存放在Map中(key:字符;value:出现次数)。
for (int i = 0; i < ch.length; i++) {
Integer freq = map.get(ch[i]);
map.put(ch[i], (freq==null)?1:freq+1);
}
int number = Integer.MAX_VALUE;
//list存放出现次数最少的字符
ArrayList<Character> list = new ArrayList<>();
//找出出现最少的字符
for (int i = 0; i < ch.length; i++) {
if(map.get(ch[i]) < number){
number = map.get(ch[i]);
list.clear();
list.add(ch[i]);
}else if(map.get(ch[i]) == number){
list.add(ch[i]);
}
}
//删除
for (char c : list) {
str = str.replace(String.valueOf(c), "");
}
System.out.println(str);
}
sc.close();
}
}
此题不用Map这种数据结构也可以解答,利用数组即可实现。其实原理和Map类似,充分利用了数组下标。
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner scan=new Scanner(System.in);
while(scan.hasNextLine()){
String str=scan.nextLine();
if(str.length()>20){
continue;
}
int []max=new int[26];
char[]ch=str.toCharArray();
int min=Integer.MAX_VALUE;
for(int i=0;i<ch.length;i++){
max[ch[i]-'a']++;
min=min>max[ch[i]-'a']?max[ch[i]-'a']:min;
}
for(int i=0;i<max.length;i++){
if(max[i]==min){
str=str.replaceAll(String.valueOf((char)(i+97)), "");
}
}
System.out.println(str);
}
}
}