由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请做一道简单题(附感想)
相关主题
求字符串最后一个单词的长度从一道简单计数排序题看test cases的枚举
请教L的分行输出题问两个G面试题
许多简单题也是不容易现场写好的写程序时的一个小问题?
leetcode上的2个整数相除请教一道leetcode的online judge题
给字符串,里边是几个单词中间没空格,输出所有可能的句子。做了一道edit distance,讨论DP的初始化阶段
刷完一遍leetcode之后要干嘛问一个c++ string的问题
请教Gap找工作对策和湾区ICC信息请问这两个 java 语句有什么区别?
看来亚麻抠门真不假,为了个空格难为小女子。请教一道题:Remove adjacent duplicate char recursively fro
相关话题的讨论汇总
话题: flag话题: int话题: 空格话题: char话题: return
进入JobHunting版参与讨论
1 (共1页)
j**l
发帖数: 2911
1
在最短的时间内写出一个C函数,用来统计一个字符串中单词的个数。假定空格为分隔
符。程序只准使用一重循环。要求又快又对,如果超时或者有bug, 这轮面试算失败
后续感想:
即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。
首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用
两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每
个单词那个例程,就用了两重循环。
另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结
尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。
程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag
,一个表示单词刚开始,一个表示在扫描整个单词的所有字符。但后者不是必需的,而
且容易让程序变复杂,容易出错。
对简单题,时间要求和bug free的要求是很严格的。写在白板上的code是否简洁干净也很重要
其实,面试并不一定是用难题来考倒人。简单题一样可以考察面试者的基本功。如果看
了大量的难题,结果面试的时候却栽在简单题上,是很可惜的。
y****w
发帖数: 3747
2
数数空格个数嘛。 多个空格,特殊符号,开头空格这些情况注意下。

【在 j**l 的大作中提到】
: 在最短的时间内写出一个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 的大作中提到】
: 在最短的时间内写出一个C函数,用来统计一个字符串中单词的个数。假定空格为分隔
: 符。程序只准使用一重循环。要求又快又对,如果超时或者有bug, 这轮面试算失败
: 后续感想:
: 即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。
: 首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用
: 两重循环,第一重找到单词开头,第二重跳过整个单词。PIE书里头反转字符串中的每
: 个单词那个例程,就用了两重循环。
: 另外如果没有想到问题的实质是检测脉冲,可能会走弯路。程序对开头有没有空格,结
: 尾有没有空格,以及全部是空格,全部是非空格这些情况都要能涵盖到。
: 程序是否简洁也很重要。比如用到的flag个数是否可以减少。比如你可以用到两个flag

d**e
发帖数: 6098
4
so fast.. i was just done, but you've posted it

【在 b******v 的大作中提到】
: 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 的大作中提到】
: 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 的大作中提到】
: 可以把空格看成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 的大作中提到】
: 在最短的时间内写出一个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 的大作中提到】
: 可以把空格看成0,非空格看成1,这样原题就类似找脉冲,可以用差分的思想,也可以
: 直接找脉冲上跳处和下跳处。
: 你的方法应该是属于找脉冲下跳处吧,可能找上跳处更直观。
: 不过如果全部是空格,你的方法至少返回1?

d**e
发帖数: 6098
9
this one is good..

【在 r****o 的大作中提到】
: 我先献丑,请多多指教。
: 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 的大作中提到】
: 修改后的程序
: 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++;
: }

相关主题
刷完一遍leetcode之后要干嘛从一道简单计数排序题看test cases的枚举
请教Gap找工作对策和湾区ICC信息问两个G面试题
看来亚麻抠门真不假,为了个空格难为小女子。写程序时的一个小问题?
进入JobHunting版参与讨论
b******v
发帖数: 1493
11
多谢,当时我的思路是找所有的空格,再考虑边界情况加一或减一,
所以就变成了找脉冲下跳处了
a是空串我修改后的程序也能处理的
pre初始为空格,所以后面遇到一串空格,计数器t不会增加

【在 j**l 的大作中提到】
: 用到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 的大作中提到】
: 多谢,当时我的思路是找所有的空格,再考虑边界情况加一或减一,
: 所以就变成了找脉冲下跳处了
: a是空串我修改后的程序也能处理的
: pre初始为空格,所以后面遇到一串空格,计数器t不会增加

j**l
发帖数: 2911
13
我说的是空指针(注意和空串的不同,空串指向"\0",是非空指针)
如果 a == NULL,
a[0]会让程序crash

【在 b******v 的大作中提到】
: 多谢,当时我的思路是找所有的空格,再考虑边界情况加一或减一,
: 所以就变成了找脉冲下跳处了
: 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 的大作中提到】
: 我说的是空指针(注意和空串的不同,空串指向"\0",是非空指针)
: 如果 a == NULL,
: a[0]会让程序crash

b******v
发帖数: 1493
16
程序很漂亮
确实考虑脉冲上跳处,程序更简单

【在 j**l 的大作中提到】
: 还有一种方法不需要任何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 的大作中提到】
: 由此想到,即使是很简单的题目,要在面试时候发挥好也不是那么容易,需要多练。
: 首先面试官会有一些特殊要求,比如这题的只许用一重循环。通常情况下大家都习惯用
: 两重循环,第一重找到单词开头,第二重跳过整个单词。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<
1 (共1页)
进入JobHunting版参与讨论
相关主题
请教一道题:Remove adjacent duplicate char recursively fro给字符串,里边是几个单词中间没空格,输出所有可能的句子。
CS 面试题总结(5)刷完一遍leetcode之后要干嘛
看一道面试题请教Gap找工作对策和湾区ICC信息
问一个关于xor的题看来亚麻抠门真不假,为了个空格难为小女子。
求字符串最后一个单词的长度从一道简单计数排序题看test cases的枚举
请教L的分行输出题问两个G面试题
许多简单题也是不容易现场写好的写程序时的一个小问题?
leetcode上的2个整数相除请教一道leetcode的online judge题
相关话题的讨论汇总
话题: flag话题: int话题: 空格话题: char话题: return