• 找出字符串中出现频率最少的字符,并将其去除


    好像是前段时间笔试什么公司的时候遇到的笔试题。记不太清楚了,似乎当晚回来就写了个比较完整的版本,不过现在才想起来写个小笔记。

    唉,现在找工作难啊,没相关的项目经验和实习经验,应届毕业生,非名校,你就已经被判了死刑了有木有!不要说你基础好啊!肯受苦啊!勤学奋进啊!爱加班哪!没人鸟你啊!伤不起啊有木有~

    好吧,吐个小槽,回来说说题目本身:

    想法是这样的,假设字符串只有英文。那就简单了,ASCII表查起。查看可知,小写字母对应的十进制范围是97到122,大写字母对应十进制65到90 。那我统计的时候判断条件就是它们对应的十进制了,小写字母统计数值放一个数组,大写字母统计数放一个数组,然后统一到一个数组。

    数组只需要创建大小为26 。因为这边简化了问题,假设是只有英文字母。

    觉得写的代码还是比较直观易懂的,就不多废话了。

    /*程序功能描述:找出字符串中出现频率最小的字母,并将其去除;
    Author:NerohHwang;
    Date:10/9/2013 Wednesday;
    */
    #include<iostream>
    #include<string.h>
    using namespace std;
    int main()
    {
        char * Str = "dhajkhfkablcjnakjyhrweuipqhydhjasbvfjhlksdabklfjhslkMm";
        //下面两个数组对照小写和大写,最后统一到一个数组中
        int iArrSmall[26];
        int iArrBig[26];
        int iSum[26];                            
        //统计
        for (int i = 0; i < 26; i ++)
        {
            iArrSmall[i] = iArrBig[i] =  0;           //全部初始化为0
            
        }
        for(int i = 0;  i < strlen(Str); i++)
        {
            if (Str[i] > 96 && Str[i] < 123)          //如果是比96大,即是属于小写字母范围;当然,不能超过小写z的范围
            {
                iArrSmall[Str[i]-97]++;
            }
            else if (Str[i] <= 90 && Str[i] > 64)    //大写字母范围
            {
                iArrBig[Str[i]-65]++;
            }
            else
            {
                cout<<"Invalid letter!"<<endl;
                system("pause");
                exit(1);
            }
        }
        for (int i = 0; i < 26 ; ++i)
        {
            iSum[i] = iArrBig[i] + iArrSmall[i];
        }
        //下面对统计结果进行选择,直接挑出最小的那一项即可,统计数需大于零,即该字母必须出现过
        int iSmallestIndex = iSum[0];
        for (int i = 1; i < 26; ++i)
        {
            if (iSmallestIndex > iSum[i] && iSum[i] > 0)
            {
                iSmallestIndex = i;
            }
        }
    
        cout<<"The smallest letter is "<<char(iSmallestIndex+97)<<" or "<<char(iSmallestIndex+65)<<endl;
        cout<<"There are "<<iSum[iSmallestIndex]<<" of them"<<endl;
    
        //更新数据
        char strNew[256];
        int  index = 0;
        for (int i = 0; i < strlen(Str) ; i++)
        {
          if (int(Str[i]) != (iSmallestIndex+97) && int(Str[i]) != (iSmallestIndex+65))
            {
                 strNew[index] = Str[i];
                 index++;
            }
        }
        strNew[index+1] = '';
        cout<<strlen(strNew)<<endl;
        cout<<strNew<<endl;
    
        //地址重新赋值,覆盖原数据
        Str = strNew;
        cout<<Str<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    mysql "The user specified as a definer ('root'@'%') does not exist" 问题
    mysql添加Federated引擎问题
    D7经典脚本[multi/handler]
    redhat7.4安装vertica-9.1.0教程
    批量在当前目录下所有的文件中添加指定字段
    mysql 水平分表技术
    linux普通用户提权
    两步完成利用procdump64+mimikatz获取win用户密码
    hibernate中对象的三种状态分析
    Hibernate 入门案例
  • 原文地址:https://www.cnblogs.com/nerohwang/p/3504666.html
Copyright © 2020-2023  润新知