用c语言删除出现次数最少的字符串,删除字符串中出现次数最少的字符

13

while True:

try:

a=input()

b=[]

c=''

for i in range(len(a)):

b.append(a.count(a[i]))

for i in range(len(a)):

if min(b)!=b[i]:

c=c+a[i]

print(c)

except:

break

发表于 2018-08-04 23:21:06

回复(6)

72

#include

#include

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

a[str[i]-'a']++;

min = a[str[0]-'a'];

for (i = 0; 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;

}

发表于 2016-04-10 14:26:42

回复(38)

24

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 m=new LinkedHashMap();

for(char c:A){

if(!m.containsKey(c)){

m.put(c,1);

}else{

m.put(c,m.get(c)+1);

}

}

Collection 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());

}

}

}

编辑于 2021-03-03 16:02:00

回复(21)

9

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

a[s.charAt(i)-97]++;

}

int min = 21;

//找出出现最小的次数

for(int i=0;i<26;i++){

if(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

if(!str.contains(s.charAt(i)+"")){

res.append(s.charAt(i));

}

}

System.out.println(res);

}

}

}

发表于 2016-04-03 19:15:18

回复(2)

22

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

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

char c = line.charAt(i);

int n = (int)(c - 'a');

if(num[n] != min) {

System.out.print(c);

}

}

System.out.println();

}

}

}

发表于 2016-03-29 11:01:32

回复(13)

24

python3的解法,

使用defaultdict来做的。 from collections import defaultdict

while True:

try:

a = input()

dd = defaultdict(int)

for i in a:

dd[i] += 1

for i in dd:

if dd[i] == min(dd.values()):

a = a.replace(i, "")

print(a)

except:

break

发表于 2017-09-06 14:18:31

回复(5)

7

一种新的编程思想:

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

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

char ch = str.charAt(i);

int n = (int)(ch - 'a');

if(num[n] != min) {

System.out.print(ch);

}

}

System.out.println();//平台本身问题,需要输出这一句

}

}

}

发表于 2018-08-07 12:06:52

回复(4)

7

#include

#include

using namespace std;

int main()

{

string str;

while(getline(cin,str))

{ int a[26]={0};

for(int i=0;i

{

a[str[i]-'a']++;

}

int min=a[str[0]-'a'];

for(int i=0;i

{

if(a[str[i]-'a']<=min)

min=a[str[i]-'a'];

}

for(int i=0;i

{

if(a[str[i]-'a']>min)

cout<

}

cout<

}

return 0;

}

发表于 2016-07-14 22:53:51

回复(7)

4

初始化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 map=new HashMap();

for(int i=0;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=map.get(c);

}

}

for(int i=0;i

char s=str.charAt(i);

if(map.get(s)!=min){

System.out.print(s);

}

}

System.out.println();

}

}

}

发表于 2018-07-12 14:44:57

回复(8)

4

纯 c

#include

#include

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

b[a[i]-'a']++;

min=b[a[0]-'a'];

for(int i=0;i

if((b[a[i]-'a'])<=min)min=b[a[i]-'a'];

for(int i=0;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

#include

#include

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

{

++arry[str[i]-'a'];

}

min=arry[str[0]-'a'];

for(int i=0;i

{

if(arry[str[i]-'a']<=min)

min=arry[str[i]-'a'];

}

for(int i=0;i

{

if(arry[str[i]-'a']>min)

cout<

}

cout<

}

return 0;

}

编辑于 2018-06-01 20:22:46

回复(1)

4

//先建表,再根据表判断哪些元素是要删除的。

//删除时,(2)方法能在O(n)时间O(1)空间内完成。

#include

#include

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;

}

发表于 2017-06-14 21:53:33

回复(2)

3

解题思路:1.首先,统计出每个字符在字符串中出现的次数,存放在动态数组num 中

2.然后,寻找数组num中的最小值

3.最后,若num[i]==min,则字符串中的第i个字符跳过,其他字符输出

C++实现代码:

#include #include

using namespace std;

int findmin(int *p,int n);

int main()

{

string str;

while(getline(cin,str))

{

int len=0,i,j;

while(str[++len]);

int *num=new int[len];

for(i=0;i

{

num[i]=0;

for(j=0;j

{

if((str[i]==str[j])&&(i!=j))

{

num[i]++;

}

}

}

int min=findmin(num,len);

for(i=0;i

{

if(num[i]==min)

{

continue;

}

cout<

}

cout<

delete []num;

}

return 0;

}

int findmin(int *p,int n)

{

int min=p[0];

for(int i=0;i

{

if(min>p[i])

{

min=p[i];

}

}

return min;

}

发表于 2019-08-22 08:48:43

回复(1)

3

import sys

for s in sys.stdin:

s=s.strip()

count=s.count(s[0])

res=''

for i in s:

count=s.count(i) if s.count(i)

for i in range(len(s)):

if s.count(s[i])>count:

res+=s[i]

print res

发表于 2018-09-14 16:17:26

回复(2)

3

这里我使用hashmap记录每个字符出现的次数,然后通过iterator对集合进行遍历查找min相同的值的char,通过replace正则表达式将这些字符全部都替换成""字符串输出即可 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 map = new HashMap();

int min = 100000;

for(int i=0; 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 set = map.keySet();

Iterator 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();

}

}

发表于 2017-09-14 13:45:28

回复(3)

3

#include

#include

#include

#include

using namespace std;

int main(){

string s;

while(cin>>s) {

//因为这里只有26个小写字母,用一个int[26]其实就足够了。。懒得改了

unordered_map 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<

}

cout<

}

return 0;

}

发表于 2017-08-02 17:16:02

回复(4)

4

该题的思路是:从题目要求来看,最基本的是要知道输入字符串中每个字符出现的次数,即,很显然这可以用Map来实现,根据求出现次数最少可以用根据value排序的TreeMap来实现,去除当中value等于最小值的字符,以下是代码

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 treeMap=new TreeMap();

for(int i=0;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> list=new ArrayList>(treeMap.entrySet());

Collections.sort(list, new Comparator>() {

//升序

@Override

public int compare(Entry o1, Entry 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 entry : list) {

if(entry.getValue()!=min){

break;

}else {

str=str.replace(entry.getKey().toString(), "");

}

}

System.out.println(str);

}

sc.close();

}

}

发表于 2017-05-01 12:24:32

回复(0)

2

import java.util.Arrays;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner sc=new Scanner(System.in);

while (sc.hasNext()) {

String target=sc.nextLine();

String min=minString(target);

char[] ch=target.toCharArray();

String res="";

for (int i = 0; i < ch.length; i++) {

if (min.indexOf(ch[i])==-1) {

res+=ch[i];

}

}

System.out.println(res);

}

}

public static String minString (String str) {

char[] ch=str.toCharArray();

int[] count=new int[26];

for (int i = 0; i < ch.length; i++) {

count[ch[i]-'a']+=1;

}

for (int i = 1; i < 13; i++) {

char[] temp = new char[20];

int k=0;

int num=0;

for (int j = 0; j < count.length; j++) {

if (count[j]==i) {

num++;

temp[k++]=(char) (j+'a');

}

}

if (num>0) {

return String.valueOf(temp);

}

}

return null;

}

}

首先想到的是 做一个count[26]的数组记录 个字母出现的次数,然后删除最小值所在字母,但是存在的问题是 最小值可能存在多个。

为了解决可能存在多个的情况,可以从双层遍历数组,外层从1到26(事实上13就够了)为当前可能出现的最小值,内层为遍历数组。如果存在count[*]==i,则这个count[*]就是最小值,遍历完数组 统计最小值的个数num 并将该字符添加到字符串中,如果num>0跳出  返回。

得到含最小出现次数的字符组成的字符串min,然后依次遍历原字符串字符 看是否包含在min中,在则删除

写的比较繁琐

发表于 2018-03-06 14:15:19

回复(0)

2

map是真的好用 #include

#include

#include

using namespace std;

int main(){

string str;

while(cin>>str){

map M;

int min=999;

for(char i='a';i<='z';i++){

M[i]=0;

}

for(int i=0;i

M[str[i]]++;

if(M[str[i]]

}

for(int i=0;i

if(M[str[i]]!=min) cout<

}

cout<

}

return 0;

}

发表于 2018-02-22 11:41:29

回复(2)

2

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 map = new LinkedHashMap<>();

for(int i=0;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 map_del = new LinkedHashMap<>();

for(Map.Entry entry:map.entrySet()){

if(entry.getValue()==min){

map_del.put(entry.getKey(),entry.getValue());

}

}

for(int i=0;i

char temp = s.charAt(i);

if(!map_del.containsKey(temp)){

result = result + String.valueOf(temp);

}

}

System.out.println(result);

}

}

发表于 2016-11-12 20:39:23

回复(0)

2

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

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 = biao[i];

}

StringBuilder sb = new StringBuilder(str);

int j = 0;

for(i=0; i<26; ++i){

for(j = 0;j

if(biao[i] == min && str.charAt(j) == (char)(i+97)){

sb.delete(j, j+1);

str = sb.toString();

}

}

}

System.out.println(sb.toString());

}

}

}

发表于 2016-09-23 14:09:19

回复(0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值