实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
注意每个输入文件有多组输入,即多个字符串用回车隔开
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
删除字符串中出现次数最少的字符后的字符串。
abcdd aabcddd
dd aaddd
#include <iostream> #include <string> using namespace std; int main() { int i, m,min; int a[26]; string str,temp; while (cin >> str) { for (int i = 0; i < 26; i++) a[i] = 0; m = str.size(); for (i = 0; i<m; i++) a[str[i]-'a']++; min = a[str[0]-'a']; for (i = 0; i<m; i++) if (a[str[i] - 'a'] <= min) min = a[str[i]-'a']; for (i = 0; i < m; i++) if (a[str[i] - 'a'] > min) cout << str[i]; cout << endl; } return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ String string=sc.nextLine(); char[] A=string.toCharArray(); Map<Character,Integer> m=new LinkedHashMap<Character,Integer>(); for(char c:A){ if(!m.containsKey(c)){ m.put(c,1); }else{ m.put(c,m.get(c)+1); } } Collection<Integer> al=m.values(); int index=Collections.min(al); StringBuffer sb=new StringBuffer(""); for(char c:A){ if(m.get(c)!=index) sb.append(c); } System.out.println(sb.toString()); } } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ String s = in.nextLine(); int[] a = new int[26]; for(int i=0;i<s.length();i++){ a[s.charAt(i)-97]++; } int min = 21; //找出出现最小的次数 for(int i=0;i<26;i++){ if(a[i]<min && a[i]>0){ min = a[i]; } } StringBuilder toBeDeleted = new StringBuilder(); for(int i=0;i<26;i++){ if(a[i]==min){ char c = (char)('a'+i); toBeDeleted.append(c); } } String str = toBeDeleted.toString(); StringBuilder res = new StringBuilder(); for(int i=0;i<s.length();i++){ if(!str.contains(s.charAt(i)+"")){ res.append(s.charAt(i)); } } System.out.println(res); } } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); while(cin.hasNext()) { int[] num = new int[26]; String line = cin.nextLine(); for(int i=0; i<line.length(); i++) { char c = line.charAt(i); int n = (int)(c - 'a'); num[n] ++; } int min = Integer.MAX_VALUE; for(int i=0; i<26; i++) { if(num[i] != 0 && num[i] < min) { min = num[i]; } } for(int i=0; i<line.length(); i++) { char c = line.charAt(i); int n = (int)(c - 'a'); if(num[n] != min) { System.out.print(c); } } System.out.println(); } } }
一种新的编程思想:
1、将26个字母转换成1-26个数字来存储,来比较;
2、数组新用法:用数组索引来代表具体的数字,用具体索引锁存的数字来代表出现的次数
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNextLine()) { String str = sc.nextLine(); int[] num = new int[26];//将字符转换为数字,存放在数组中 for(int i=0; i<str.length(); i++) { char ch = str.charAt(i); int n = (int)(ch - 'a'); num[n] ++; } int min = Integer.MAX_VALUE;//当不知有多少重复次数时的固定操作 for(int i=0; i<26; i++) { if(num[i] != 0 && num[i] < min) { min = num[i]; } } for(int i=0; i<str.length(); i++) { char ch = str.charAt(i); int n = (int)(ch - 'a'); if(num[n] != min) { System.out.print(ch); } } System.out.println();//平台本身问题,需要输出这一句 } } }
#include<iostream> #include<string> using namespace std; int main() { string str; while(getline(cin,str)) { int a[26]={0}; for(int i=0;i<str.length();i++) { a[str[i]-'a']++; } int min=a[str[0]-'a']; for(int i=0;i<str.length();i++) { if(a[str[i]-'a']<=min) min=a[str[i]-'a']; } for(int i=0;i<str.length();i++) { if(a[str[i]-'a']>min) cout<<str[i]; } cout<<endl; } return 0; }
初始化min=1,建一个map,存Character和Integer,然后循环遍历字符串,存到map里,如果已经存在那 value+1,比较value和min,更新min,循环结束后在遍历字符串,只要map.get(当前char)的值不等于 min,那么就输出,最后在加上一个System.out.println()就不会出先拿个iiiizzzz import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { /** * 题目描述实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。 * 输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 * 输入描述:字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。 * 输出描述:删除字符串中出现次数最少的字符后的字符串。 * 输入:abcdd * 输出:dd */ public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ String str=sc.nextLine(); int min=1; Map<Character,Integer> map=new HashMap<Character,Integer>(); for(int i=0;i<str.length();i++){ char c=str.charAt(i); if(map.containsKey(c)){ map.put(c, map.get(c)+1); }else{ map.put(c,1); } if(map.get(c)<min){ min=map.get(c); } } for(int i=0;i<str.length();i++){ char s=str.charAt(i); if(map.get(s)!=min){ System.out.print(s); } } System.out.println(); } } }
纯 c #include<stdio.h> #include<string.h> int main(){ char a[20]; while(scanf("%s",a)!=EOF) { int b[26]; for(int i=0;i<26;i++) b[i]=0; int min=0; for(int i=0;i<strlen(a);i++) b[a[i]-'a']++; min=b[a[0]-'a']; for(int i=0;i<strlen(a);i++) if((b[a[i]-'a'])<=min)min=b[a[i]-'a']; for(int i=0;i<strlen(a);i++) if((b[a[i]-'a'])>min) printf("%c",a[i]); memset( a, 0, sizeof(a) ); //clear a[20] printf("\n");//vs能运行,到这里就得加换行符 } //system("pause"); return 0; } #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string str; while(cin>>str)//不能用getline(cin,str) { int len=str.size(); int arry[26]={0}; int min=0; for(int i=0;i<len;++i) { ++arry[str[i]-'a']; } min=arry[str[0]-'a']; for(int i=0;i<len;++i) { if(arry[str[i]-'a']<=min) min=arry[str[i]-'a']; } for(int i=0;i<len;++i) { if(arry[str[i]-'a']>min) cout<<str[i]; } cout<<endl; } return 0; }
//先建表,再根据表判断哪些元素是要删除的。 //删除时,(2)方法能在O(n)时间O(1)空间内完成。 #include<iostream> #include<string> using namespace std; int main() { string str; while (cin >> str) { int mp[26] = { 0 }; for (int i = 0; i < str.size(); ++i) mp[str[i] - 'a']++; int min = 10000; for (int i = 0; i < 26; ++i) { if (mp[i] != 0 && mp[i] < min) min = mp[i]; } //(1)当数据量很大时,这肯定耗时 /*for (int i = 0; i < str.size(); ) { if (mp[str[i] - 'a'] == min) str.erase(i, 1); else ++i; } cout << str << endl;*/ //(2)前后交换 int i = 0, j = 0; while(j < str.size()) { if(i >= j || mp[str[j] - 'a'] == min) j++; else if(mp[str[i] - 'a'] == min) swap(str[i++], str[j++]); else ++i; } cout << str.substr(0,i) << endl; } return 0; }
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Scanner; import java.util.Set; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ String str = in.next(); Map<Character,Integer> map = new HashMap<Character,Integer>(); int min = 100000; for(int i=0; i<str.length(); i++){ char c = str.charAt(i); if (map.containsKey(c)) { int val = map.get(c); map.put(c, val + 1); if (val < min) min = val; continue; } map.put(c, 0); min = 0; } Set<Character> set = map.keySet(); Iterator<Character> it = set.iterator(); while(it.hasNext()){ char c = it.next(); if(map.get(c) == min) str = str.replaceAll("["+c+"]*", ""); } System.out.println(str); } in.close(); } }
#include <iostream> #include <string> #include <unordered_map> #include <math.h> using namespace std; int main(){ string s; while(cin>>s) { //因为这里只有26个小写字母,用一个int[26]其实就足够了。。懒得改了 unordered_map<char,int> freq; int smallest = 1; for(char c : s) { freq[c]++; smallest = min(smallest,freq[c]); } for(char c : s){ if(freq[c]==smallest) continue; cout<<c; } cout<<endl; } return 0; }
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; /** * * @author 云上奔跑 * @date 2017年5月1日 下午12:24:13 */ public class Main { public static void main(String[] args){ Scanner sc=new Scanner(System.in); while (sc.hasNextLine()) { String str=sc.nextLine(); //利用Map来处理 Map<Character, Integer> treeMap=new TreeMap<Character, Integer>(); for(int i=0;i<str.length();i++){ if(treeMap.containsKey(str.charAt(i))){ treeMap.put(str.charAt(i), treeMap.get(str.charAt(i))+1); }else { treeMap.put(str.charAt(i), 1); } } //因为要根据value来排序,所以转换成list,重写sort List<Entry<Character, Integer>> list=new ArrayList<Entry<Character, Integer>>(treeMap.entrySet()); Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() { //升序 @Override public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) { // TODO Auto-generated method stub return o1.getValue().compareTo(o2.getValue()); } }); int min=1; if(list!=null){ //获取list第一个value值,即最小值 min=list.get(0).getValue(); } //去除出现次数最少的字符 for (Entry<Character, Integer> entry : list) { if(entry.getValue()!=min){ break; }else { str=str.replace(entry.getKey().toString(), ""); } } System.out.println(str); } sc.close(); } }
#include <iostream> #include <string> #include <map> using namespace std; int main(){ string str; while(cin>>str){ map<char,int> M; int min=999; for(char i='a';i<='z';i++){ M[i]=0; } for(int i=0;i<str.size();i++){ M[str[i]]++; if(M[str[i]]<min) min=M[str[i]]; } for(int i=0;i<str.size();i++){ if(M[str[i]]!=min) cout<<str[i]; } cout<<endl; } return 0; }
package HUAWEI; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Scanner; /** * 删除字符串中出现次数最少的字符 * @author Administrator * */ public class Demo23 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String s = sc.next(); convert(s); } sc.close(); } public static void convert(String s){ String result = ""; LinkedHashMap<Character,Integer> map = new LinkedHashMap<>(); for(int i=0;i<s.length();i++){ char temp = s.charAt(i); if(map.containsKey(temp)){ int value = map.get(temp); value++; map.put(temp,value); }else{ map.put(temp,1); } } int min = Collections.min(map.values()); LinkedHashMap<Character,Integer> map_del = new LinkedHashMap<>(); for(Map.Entry<Character,Integer> entry:map.entrySet()){ if(entry.getValue()==min){ map_del.put(entry.getKey(),entry.getValue()); } } for(int i=0;i<s.length();i++){ char temp = s.charAt(i); if(!map_del.containsKey(temp)){ result = result + String.valueOf(temp); } } System.out.println(result); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) {//注意while处理多个case String str = sc.nextLine(); int[] biao = new int[26]; int i = 0; for(i=0;i<str.length();++i){ biao[str.charAt(i) - 97]++; } int min = 0; for(i=0;i<26;++i){ if(biao[i]!=0){ min = biao[i]; break; } } for(i=0;i<26;++i){ if(biao[i]!=0 && biao[i]<min) min = biao[i]; } StringBuilder sb = new StringBuilder(str); int j = 0; for(i=0; i<26; ++i){ for(j = 0;j<str.length();++j){ if(biao[i] == min && str.charAt(j) == (char)(i+97)){ sb.delete(j, j+1); str = sb.toString(); } } } System.out.println(sb.toString()); } } }