题解 | #删除字符串中出现次数最少的字符#

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

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];
        }
    }
}




#华为笔试##牛客网在线编程##算法#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务