首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >计算一个单词出现的次数

计算一个单词出现的次数
EN

Code Review用户
提问于 2012-08-15 10:13:09
回答 5查看 53.4K关注 0票数 9

我被选为第三轮MS实习的第三年。令人惊讶的是,我们被问到了一个非常简单的问题:“制作一个计算单词"a”或"A“发生次数的程序。”我写了下面的代码,被拒绝参加最后的面试。

我的密码怎么了?请告诉我如何改进它。使用Char[]而不是string的人和那些没有检查第一个和最后一个单词是"A“的人都被选中了。“a”前后的逗号条件也被忽略了。错误是什么?str.at(i)不够好吗?我知道,即使我们使用str[i],它也被解释为str.operator[](i),所以我正在阻止开销转换,对吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream> 
#include<ctype.h>
#include<string>

using namespace std;

int main()
{

    string str;

    getline(cin,str);

    int i;
    int count=0;
    int l=str.length();

    for(i=1;i<l-1;i++)
    {
        if(toupper(str.at(i))=='A')
            if(str.at(i-1)==' ' && str.at(i+1)==' ')
                    count++;
    }

    if(toupper(str.at(0))=='A' && str.at(1)==' ')
        count++;

    if(toupper(str.at(l-1))=='A' && str.at(l-2)==' ')
        count++;

    cout<<"Count is "<<count<<endl;
    return 0;

}
EN

回答 5

Code Review用户

回答已采纳

发布于 2012-08-17 02:14:54

首先,这些面试问题往往是个骗局。您的代码是否适用于所有情况并不重要(每个人都会出错)。重要的是如何编写代码。

即使他们专门要求'a‘或'A',你也不应该硬编码这些值。它们是一个参数。理解程序的输入始终是第一项任务。如果他们问你“制作一个计算字母'a‘在’示例‘中出现的次数的程序”,正确的答案将不是return 1;。他们也要求单词,你不应该假设程序应该只搜索有一个字母的单词。

第二,单词通常不是由空格分隔的。您应该考虑所有空格和标点符号。或者只声明一个函数isWordDelimiter(char),而不实现它。

第三,您的代码不容易读懂。iffor中的另一个if中?使用函数。示例(伪代码-我不是C++程序员,我忘记了STL):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while ((word = getNextWord(input)) != NULL) {
    if (word is in set of searched words) {  //replace this with STL set
        count++
    }
}

摘要:即使在一个非常简单的程序中,他们也能看到你有多有经验。优秀的开发人员不会仅仅写一些有用的东西。他必须考虑问题将如何在未来发展(不同的参数),如何维护程序(编写可读的代码)。优秀的开发人员也会从上到下编写程序--首先使用高级函数定义结构,然后编写函数的实现。

票数 11
EN

Code Review用户

发布于 2012-08-15 10:35:22

您应该通过最充分地使用标准库来做到这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::istringstream ss(str);
auto count = std::count_if(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>(), 
             [](const std::string& s){ return s == "a" || s == "A"; });
票数 7
EN

Code Review用户

发布于 2012-08-15 10:36:08

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
included <iostream> <ctype.h> <string>

如果这是您发送的实际代码,我可能不会读过这一行。它不是有效的C++或任何东西。这意味着您甚至没有尝试编译和运行这个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using namespace std;

int main()
{

    string str;

    getline(cin,str);

    int i;

为什么要在这里声明它而不是for循环?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int count=0;
    int l=str.length();

    for(i=1;i<l-1;i++)
    {
        if(toupper(str.at(i))=='A')
            if(str.at(i-1)==' ' && str.at(i+1)==' ')
                    count++;

我就不会像这样嵌套无支撑块了。它会使事情更难读懂。}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    if(toupper(str.at(0))=='A' && str.at(1)==' ')
        count++;

    if(toupper(str.at(l-1))=='A' && str.at(l-2)==' ')
        count++;

这是一个丑陋的解决方案。如果你把这件事做进循环会更好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    cout<<"Count is "<<count<<endl;
    return 0;

}
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/14711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文