代码改变世界

面试题1: 统计某个字符在目标字符串中出现的次数

2016-02-17 21:43  Keiven_LY  阅读(8565)  评论(0编辑  收藏  举报

题目描述:统计某个字符在目标字符串中出现的次数

解题思路:

方法1:循环------逐个比较,统计次数

方法2:递归------递归也是一种特殊的循环

如果采用递归函数的思路来解决这个问题,那么整个统计过程就变为:从目标字符串的开始位置查找这个字符,如果找到,那么字符出现的次数就成了已经找到的这一次加上在剩下的字符串中出现的次数,在程序中我们可以用“1 + numOfchar(pos+1, c)”来表示,其中“1”表示已经找到的字符出现一次,而“numOfchar(pos+1, c)”则代表了字符在剩下的字符串中出现的次数,加起来刚好就是字符在整个字符串中出现的次数。这里的“numOfchar(pos+1, c)”就是在变更开始条件后对numOfchar()函数的递归调用,进行第二次查找与统计。第二次查找也会进行类似的查找统计过程,如果找到则会第三次调用numOfchar()函数继续向后继续查找统计。这个过程会不断地持续进行下去,直到最后满足递归的终止条件——查找到了字符串的结尾,再也找不到这个字符——为止。在这个过程中,有需要循环往复执行的相同动作——从字符串开始位置查找目标字符;有不同的开始条件——在字符串的不同位置开始查找;有终止条件——在字符串中再也找不到目标字符。

有了这三个特征,我们就可以用函数的递归调用更轻松而自然地解决这个问题

 

实现代码:

/*  统计某个字符在目标字符串中出现的次数  */

#include <iostream>
#include <cstring>  // 引入字符查找函数strchr()所在的头文件
using namespace std;


/*  方法1: 循环实现函数功能  */
/* int numOfChar(const char *str, const char c)
{
    int nTotal = 0; // 记录字符出现次数

    // 在字符串中查找字符,并对结果进行判断
    // 如果strchr()返回nullptr,则表示查找完毕,循环结束
    while(nullptr != (str=strchr(str, c)))
    {
        ++nTotal; 
        ++str;  // 字符串往后移动,开始下一次循环
    }

    return nTotal;
}
*/

/*  方法2: 递归实现函数功能  */
int numOfChar(char *str, const char c)
{

    // 从字符串str的开始位置查找字符c
    char *pos = strchr(str,c);

    // 如果strchr()函数的返回值为nullptr,则意味着
    // 在字符串中再也找不到目标字符,递归的终止条件得到满足
    // 则结束函数的递归调用,直接返回本次的查找结果0  
    if(nullptr == pos)
    {
        return 0;
    }

    // 如果没有达到终止条件,则将本次查找结果1统计在内,
    // 并在新的开始位置pos + 1开始下一次查找,实现函数的递归调用
    return 1 + numOfChar(pos + 1,c);

}

int main()
{     
    char str[] = "Shanghai is a big city";  //给定字符串
    char ch = 'h'; //目标字符
    
    // 调用CountChar()函数进行统计
    int nCount = numOfChar(str,ch);
    // 输出结果
    cout<<"字符\'"<<ch<<"\'在\""<<str<<"\"中出现了"<<nCount<<""<<endl;

    system("pause");
    return 0;
}

 

结果如下: