首页 > 学院 > 开发设计 > 正文

华为机试在线训练-牛客网(14)删除字符串中出现次数最少的字符

2019-11-11 07:07:08
字体:
来源:转载
供稿:网友

题目描述

实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

输入描述:

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

输出描述:

删除字符串中出现次数最少的字符后的字符串。

输入例子:
abcdd
输出例子:
dd此题可以引用《华为机试在线训练-牛客网(12)密码验证合格程序》一文中衍生问题的一个思路,不过此处更简单,不需要统计子串重复情况而是统计字符重复情况,对于字符统计可以直接使用泛型算法count()。另外记录下重复次数最少的所有索引,根据索引号用“0”替换,再调用remove()算法删除所有为'0'的字符。

注意:此处不能直接用string::erase()循环删除pos位置的字符,因为每次根据pos删除一个字符后索引号已改变,下一次删除无效。

完整AC的代码如下:

#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;int main(){    string inStr;    while(getline(cin,inStr)){            int tempCnt=0;            int minCnt=100;            vector<int > minPos;            for(int i=0;i<inStr.size();i++){                tempCnt= count(inStr.begin(),inStr.end(),inStr[i]);                if(tempCnt<=minCnt){                    if(tempCnt<minCnt)minPos.clear();                    minCnt=tempCnt;                    minPos.push_back(i);                }            }            for(auto pos:minPos)                inStr.replace(pos,1,"0");             int pos;             while((pos=inStr.find('0'))!=string::npos){                    inStr.erase(pos,1);             }             cout<<inStr<<endl;    }}


上一篇:LintCode 407:Plus One

下一篇:mybatis的学习

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表