j**l 发帖数: 2911 | 1 在最短的时间内写出一个C函数,用来统计一个字符串中单词的个数。假定空格为分隔
符。程序只准使用一重循环。要求又快又对,如果超时或者有bug, 这轮面试算失败
后续感想:
即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。
首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用
两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每
个单词那个例程,就用了两重循环。
另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结
尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。
程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag
,一个表示单词刚开始,一个表示在扫描整个单词的所有字符。但后者不是必需的,而
且容易让程序变复杂,容易出错。
对简单题,时间要求和bug free的要求是很严格的。写在白板上的code是否简洁干净也很重要
其实,面试并不一定是用难题来考倒人。简单题一样可以考察面试者的基本功。如果看
了大量的难题,结果面试的时候却栽在简单题上,是很可惜的。 |
y****w 发帖数: 3747 | 2 数数空格个数嘛。 多个空格,特殊符号,开头空格这些情况注意下。
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 在最短的时间内写出一个C函数,用来统计一个字符串中单词的个数。假定空格为分隔 : 符。程序只准使用一重循环。要求又快又对,如果超时或者有bug, 这轮面试算失败 : 后续感想: : 即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。 : 首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用 : 两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每 : 个单词那个例程,就用了两重循环。 : 另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结 : 尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。 : 程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag
|
b******v 发帖数: 1493 | 3 unsigned int countWords(char* a)
{
unsigned int t=0, i;
bool flag=false; /* whether the previous char is space */
for(i=0;a[i]!='\0';i++) {
if(a[i]==' ') {
if(flag==false)
t++;
flag = true;
}
if(a[i]!=' ') {
flag = false;
}
}
if(a[0] == ' ')
return t;
else
return t+1;
}
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 在最短的时间内写出一个C函数,用来统计一个字符串中单词的个数。假定空格为分隔 : 符。程序只准使用一重循环。要求又快又对,如果超时或者有bug, 这轮面试算失败 : 后续感想: : 即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。 : 首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用 : 两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每 : 个单词那个例程,就用了两重循环。 : 另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结 : 尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。 : 程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag
|
d**e 发帖数: 6098 | 4 so fast.. i was just done, but you've posted it
【在 b******v 的大作中提到】![](/moin_static193/solenoid/img/up.png) : unsigned int countWords(char* a) : { : unsigned int t=0, i; : bool flag=false; /* whether the previous char is space */ : for(i=0;a[i]!='\0';i++) { : if(a[i]==' ') { : if(flag==false) : t++; : flag = true; : }
|
j**l 发帖数: 2911 | 5 可以把空格看成0,非空格看成1,这样原题就类似找脉冲,可以用差分的思想,也可以
直接找脉冲上跳处和下跳处。
你的方法应该是属于找脉冲下跳处吧,可能找上跳处更直观。
不过如果全部是空格,你的方法至少返回1?
【在 b******v 的大作中提到】![](/moin_static193/solenoid/img/up.png) : unsigned int countWords(char* a) : { : unsigned int t=0, i; : bool flag=false; /* whether the previous char is space */ : for(i=0;a[i]!='\0';i++) { : if(a[i]==' ') { : if(flag==false) : t++; : flag = true; : }
|
b******v 发帖数: 1493 | 6 嗯,我的程序是有个bug
最后还应该判断一下最后一个字符是否是空格
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 可以把空格看成0,非空格看成1,这样原题就类似找脉冲,可以用差分的思想,也可以 : 直接找脉冲上跳处和下跳处。 : 你的方法应该是属于找脉冲下跳处吧,可能找上跳处更直观。 : 不过如果全部是空格,你的方法至少返回1?
|
r****o 发帖数: 1950 | 7 我先献丑,请多多指教。
int Countwords(const char *str, const int len)
{
int count=0;
if (len==0) return 0;
for (int i=0; i
{
if ((str[i]!=' ')&&(str[i+1]==' '))
count++;
}
if (str[len-1]!=' ')
count++;
return count;
}
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 在最短的时间内写出一个C函数,用来统计一个字符串中单词的个数。假定空格为分隔 : 符。程序只准使用一重循环。要求又快又对,如果超时或者有bug, 这轮面试算失败 : 后续感想: : 即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。 : 首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用 : 两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每 : 个单词那个例程,就用了两重循环。 : 另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结 : 尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。 : 程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag
|
b******v 发帖数: 1493 | 8 修改后的程序
unsigned int countWords(char* a)
{
unsigned int t=0, i;
char pre = a[0];
for(i=0;a[i]!='\0';i++) {
if(a[i]==' ') {
if(pre!=' ')
t++;
}
pre = a[i];
}
if(pre == ' ') /* the last char is a space */
return t;
else
return t+1;
}
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 可以把空格看成0,非空格看成1,这样原题就类似找脉冲,可以用差分的思想,也可以 : 直接找脉冲上跳处和下跳处。 : 你的方法应该是属于找脉冲下跳处吧,可能找上跳处更直观。 : 不过如果全部是空格,你的方法至少返回1?
|
d**e 发帖数: 6098 | 9 this one is good..
【在 r****o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我先献丑,请多多指教。 : int Countwords(const char *str, const int len) : { : int count=0; : if (len==0) return 0; : for (int i=0; i: { : if ((str[i]!=' ')&&(str[i+1]==' ')) : count++; : }
|
j**l 发帖数: 2911 | 10 用到flag的思路很好,但为什么不去找脉冲上跳处呢(前面为空格,后面为非空格)
另外a是空指针(不是空串)没处理。
【在 b******v 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 修改后的程序 : unsigned int countWords(char* a) : { : unsigned int t=0, i; : char pre = a[0]; : for(i=0;a[i]!='\0';i++) { : if(a[i]==' ') { : if(pre!=' ') : t++; : }
|
|
|
b******v 发帖数: 1493 | 11 多谢,当时我的思路是找所有的空格,再考虑边界情况加一或减一,
所以就变成了找脉冲下跳处了
a是空串我修改后的程序也能处理的
pre初始为空格,所以后面遇到一串空格,计数器t不会增加
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 用到flag的思路很好,但为什么不去找脉冲上跳处呢(前面为空格,后面为非空格) : 另外a是空指针(不是空串)没处理。
|
b******v 发帖数: 1493 | 12 其实原来用flag的程序修改一下也能用
主要改动是把flag初始为true,而不是false
这样就能处理初始字符为空格的情况
并且最后判断最后一个字符是否为空格,
这样就能处理最后字符是空格的情况
由于每次只用写1bit,估计比用pre字符的会稍微快一点
unsigned int countWords(char* a)
{
unsigned int t=0, i;
bool flag=true; /* whether the previous char is space */
for(i=0;a[i]!='\0';i++) {
if(a[i]==' ') {
if(flag==false)
t++;
flag = true;
}
if(a[i]!=' ') {
flag = false;
}
}
if(flag == true) /* the last char is space */
return t;
else
return t+1;
}
【在 b******v 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 多谢,当时我的思路是找所有的空格,再考虑边界情况加一或减一, : 所以就变成了找脉冲下跳处了 : a是空串我修改后的程序也能处理的 : pre初始为空格,所以后面遇到一串空格,计数器t不会增加
|
j**l 发帖数: 2911 | 13 我说的是空指针(注意和空串的不同,空串指向"\0",是非空指针)
如果 a == NULL,
a[0]会让程序crash
【在 b******v 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 多谢,当时我的思路是找所有的空格,再考虑边界情况加一或减一, : 所以就变成了找脉冲下跳处了 : a是空串我修改后的程序也能处理的 : pre初始为空格,所以后面遇到一串空格,计数器t不会增加
|
j**l 发帖数: 2911 | 14 还有一种方法不需要任何flag
int t = 0;
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] != ' ')
{
// 利用了 || 操作符的短路操作
if (i == 0 || a[i-1] == ' ')
t++;
}
}
return t; |
b******v 发帖数: 1493 | 15 有道理
应该开头加一句
if(a == NULL)
return 0;
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我说的是空指针(注意和空串的不同,空串指向"\0",是非空指针) : 如果 a == NULL, : a[0]会让程序crash
|
b******v 发帖数: 1493 | 16 程序很漂亮
确实考虑脉冲上跳处,程序更简单
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 还有一种方法不需要任何flag : int t = 0; : for (int i = 0; a[i] != '\0'; i++) : { : if (a[i] != ' ') : { : // 利用了 || 操作符的短路操作 : if (i == 0 || a[i-1] == ' ') : t++; : }
|
j**l 发帖数: 2911 | 17 由此想到,即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。
首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用
两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每
个单词那个例程,就用了两重循环。
另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结
尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。
程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag
,一个表示单词刚开始,一个表示在扫描整个单词的所有字符。但后者不是必需的,而
且容易让程序变复杂,容易出错。
对简单题,时间要求和bug free的要求是很严格的
其实,面试并不一定是用难题来考倒人。简单题一样可以考察面试者的基本功。如果看
了大量的难题,结果面试的时候却栽在简单题上,是很可惜的。
其实大家看了那么多难题名题,也决不能忽视对简单题的练习。或许大家还真应该希望碰上的都是见过的难题名题。当碰到一道看去很简单的问题,不可窃喜和掉以轻心,一定要注意有没有什么附加限制,有没有什么陷阱,尽量快 |
b******v 发帖数: 1493 | 18 我amazon一面时就遇到这样的情况
一道很简单的题,怎样判断两个BST是否相同
结果我给了判断inorder traversal和preorder traversal是否相同的解法,并coding
用掉了面试大部分的时间
其实只需要用递归判断当前节点,左子树,右子树是否相同就可以了
好在他们还是给了我二面的机会,希望我不会再次搞砸
flag
【在 j**l 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 由此想到,即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。 : 首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用 : 两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每 : 个单词那个例程,就用了两重循环。 : 另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结 : 尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。 : 程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag : ,一个表示单词刚开始,一个表示在扫描整个单词的所有字符。但后者不是必需的,而 : 且容易让程序变复杂,容易出错。 : 对简单题,时间要求和bug free的要求是很严格的
|
t***e 发帖数: 446 | 19 what about this?
#include
#include
using namespace std;
unsigned int CountWord(const char* ch)
{
unsigned int cnt=0;
bool flag=true; /*check for consecutive spaces*/
if (ch==NULL)
return cnt;
for (size_t i=0; ch[i]!='\0'; ++i)
{
if (ch[i]==' ' && flag==false)
{++cnt;flag=true;}
if (ch[i]!=' ')
flag=false;
}
if (flag==false)
++cnt;
return cnt;
}
int main()
{
cout< |