我被选为第三轮MS实习的第三年。令人惊讶的是,我们被问到了一个非常简单的问题:“制作一个计算单词"a”或"A“发生次数的程序。”我写了下面的代码,被拒绝参加最后的面试。
我的密码怎么了?请告诉我如何改进它。使用Char[]
而不是string
的人和那些没有检查第一个和最后一个单词是"A“的人都被选中了。“a”前后的逗号条件也被忽略了。错误是什么?str.at(i)
不够好吗?我知道,即使我们使用str[i]
,它也被解释为str.operator[](i)
,所以我正在阻止开销转换,对吗?
#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;
}
发布于 2012-08-17 02:14:54
首先,这些面试问题往往是个骗局。您的代码是否适用于所有情况并不重要(每个人都会出错)。重要的是如何编写代码。
即使他们专门要求'a‘或'A',你也不应该硬编码这些值。它们是一个参数。理解程序的输入始终是第一项任务。如果他们问你“制作一个计算字母'a‘在’示例‘中出现的次数的程序”,正确的答案将不是return 1;
。他们也要求单词,你不应该假设程序应该只搜索有一个字母的单词。
第二,单词通常不是由空格分隔的。您应该考虑所有空格和标点符号。或者只声明一个函数isWordDelimiter(char)
,而不实现它。
第三,您的代码不容易读懂。if
在for
中的另一个if
中?使用函数。示例(伪代码-我不是C++程序员,我忘记了STL):
while ((word = getNextWord(input)) != NULL) {
if (word is in set of searched words) { //replace this with STL set
count++
}
}
摘要:即使在一个非常简单的程序中,他们也能看到你有多有经验。优秀的开发人员不会仅仅写一些有用的东西。他必须考虑问题将如何在未来发展(不同的参数),如何维护程序(编写可读的代码)。优秀的开发人员也会从上到下编写程序--首先使用高级函数定义结构,然后编写函数的实现。
发布于 2012-08-15 10:35:22
您应该通过最充分地使用标准库来做到这一点:
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"; });
发布于 2012-08-15 10:36:08
included <iostream> <ctype.h> <string>
如果这是您发送的实际代码,我可能不会读过这一行。它不是有效的C++或任何东西。这意味着您甚至没有尝试编译和运行这个。
using namespace std;
int main()
{
string str;
getline(cin,str);
int i;
为什么要在这里声明它而不是for循环?
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;
}
https://codereview.stackexchange.com/questions/14711
复制相似问题