华为机试题
题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
示例1
输入
abcdd
输出
dd
思路:用桶存放字符出现的次数。然后在找出出现次数最少的字符(这里因为桶中会有许多0,所以选的时候排除个数为0的情况)。最后遍历字符串中的字符,看它在出现的次数>最小次数,就输出。
当然,也可以遍历字符串,如果字符出现次数等于最小次数,就用place(,"")代替字符,该方法是替换所有
import java.util.LinkedList; import java.util.Scanner; /* * 第一行一个数T(T ≤ 100),表示数据组数。 * 对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌组从上到下的序列。 */ public class Main { public static void main(String[] args){ Scanner sc=new Scanner(System.in); int[] tong=new int[26]; while(sc.hasNext()){ String s=sc.next(); char[] c=s.toCharArray(); //只能放小写字母,用来放每个字符出现的次数 //初始化桶 for(int i=0;i<tong.length;i++) tong[i]=0;
for(int i=0;i<c.length;i++){ tong[c[i]-'a']++; } //找出出现最少的次数,也就是找出tong数组中的最小值 int min=Integer.MAX_VALUE; for(int i=0;i<tong.length;i++){ if(tong[i]!=0&&tong[i]<min) min=tong[i]; } //遍历字符串,当字符出现的次数>最小次数,就输出
//这里是关键,字符出现的次数,就是字符在桶中的大小 for(int i=0;i<c.length;i++){ if(tong[c[i]-'a']>min){ System.out.print(c[i]); } }
//这里一定要输出换行,因为还有下一次输入 System.out.println(); } } }