题解 | #删除字符串中出现次数最少的字符#
删除字符串中出现次数最少的字符
https://www.nowcoder.com/practice/05182d328eb848dda7fdd5e029a56da9
思路:
1.总结本题特点:输入数据全为小写字母,输出要求删掉其中出现次数最少的字母,且出现次数最少的字母可能有多个
2.解题思路:
- 采用长度为26且初始值都为0的整型数组, 作为a-z共26个英文字母出现次数的统计数组,统计字符串中各个字母的出现次数;
- 采用局部最优的思想,在遍历统计数组的过程中,判断当前情况下出现次数的最小值并记录相应字母到容器A中;后续遍历时,若查找到更小的出现次数,则更新最小出现次数,同时此前得到的字母无效,需要清空容器A;出现和已知最小出现次数相等的次数时,说明出现了次数相等的字母,符合需要删除的字母条件,只需要再放入容器A中。
- 再重新遍历字符串中的每个字符,当字符可在容器A在找到时,不做输出处理;否则输出字符。
#include<iostream>
#include<string>
using namespace std;
int main() {
string mstr;
getline(cin, mstr);
//统计a-z的出现次数
int countAlp[26] = { 0 };//初始化计数数组
for (int i = 0; i < mstr.length(); i++) { //0-25的索引位置来计数a-z字符的个数
countAlp[mstr[i] - 'a'] ++;
}
//寻找出现次数最少的字母
int min = 0;//用来存放截至目前所得到的出现的最小次数
string strMin = "";//用来存放截至目前查找到的出现次数最小的字母
for (int i = 0; i < 26; i++) {
if (min == 0 && countAlp[i] != 0) { //查找到第一个非零的出现次数,作为初始化值
min = countAlp[i];
strMin.append(1, i + 'a');
}
else if (min > countAlp[i] && countAlp[i] != 0 ) {//查找到出现次数更少的元素,之前查找到的字母无效,
//清空字符串后重新记录
strMin.clear(); //更新strMin
strMin.append(1, i+'a');
min = countAlp[i];//更新最 小次数
}
else if (min == countAlp[i] ) {//查找到出现次数最少的重复字母,之前查找到的strMin中的元素依然有效,只需要记录当前字母
strMin.append(1, i + 'a');
}
}
//输出除出现次数最少字母外的其他字母
for (int i = 0; i < mstr.length(); i++) {
if (strMin.find( mstr[i]) == -1) {
cout << mstr[i];
}
}
}
查看20道真题和解析
