avatar
放c code求老师傅指教# JobHunting - 待字闺中
s*e
1
update:
谢谢板上各位老师傅,现在我知道是我的问题了,“without using a second string
”我没有理解好,感谢大家赐教,我继续努力!
刚刚解决身份问题,男,找工作和leetcode都有一段时间了,最近碰到这家公司的一个
面试
http://stackoverflow.com/jobs/115265/software-engineer-networking-schweitzer-engineering?searchTerm=SEL&offset=3&sort=s
问的问题和glassdoor一样,所以我也准备了一下那个unions的答案和例子,以前没用
这个:
Interview Questions
1) What is in the software requirements?
2) What is mutex and semaphore?
3) When to use unions?
4) What are the pros and cons of using assembly in embedded systems?
5) Programming test: Write a function that will operate on a C-string and
convert all instances of "AB" to "C" without using a second string for
temporary storage.
Use the following function signature:
void translate(char *str)
So for example:
char astring[] = "helloABworld";
translate(astring);
// Now astring holds "helloCworld";
Your function should handle strings of arbitrary length. If you have any
questions about the problem, make reasonable assumptions and state your
assumptions in your reply.
正好我最近在用C的IPC 写一个server,client和cache的file transfer,主要用message
queue和named pipe做server和cache的sync, shared memory来communicate file,
所以30 分钟写这个题目,我以为无压力。
下面是我发回去的code:
#include
#include
#include
void helper(char *src, char *str, char *rep) {
int count = 0;
char *fre = strdup(src);
char *new = fre;
while (*new) {
count++;
new ++;
}
free(fre);
char buf[count];
char *p = strstr(src, str);
do {
if (p) {
memset(buf, '\0', count * sizeof(char));
if (src == p) {
strcpy(buf, rep);
strcat(buf, p + strlen(str));
} else {
strncpy(buf, src, strlen(src) - strlen(p));
strcat(buf, rep);
strcat(buf, p + strlen(str));
}
memset(src, '\0', strlen(src));
strcpy(src, buf);
}
} while (p && (p = strstr(src, str)));
}
void translate(char *str) { helper(str, "AB", "C"); }
int main(void) {
// assuming replacing all the "AB" with 'C',
// it could be replacing the first ,or Nth occurrence of "AB" with C only
char astring[] = "helloABworld";
// helper(astring, "AB", "C");
translate(astring);
puts(astring);
// char astring1[] = "helloABddABworld";
// helper(astring, "AB", "C");
// translate(astring1);
// puts(astring1);
return 0;
}
这个是我用来检查的script,可以跑,没看到有memory leak:
gcc -Wall --std=gnu99 -g3 -Wno-format-security -fno-omit-frame-pointer -o
sel sel.c
valgrind --track-origins=yes --leak-check=full --show-leak-kinds=all ./sel
就是这样,我也被rej,周四下午发的code,今天周一10点收到rej。那天面试我的是一
个刚WSU毕业的小白HR intern,当时就觉得不对劲。打电话过来的时候还迟到20分钟,
没想到我就这样被她拿来练手了.
我以前在数学系写数值模拟的code,fortran,bash python用得比较多,c也用一点,做
的东西太偏向Government和NASA的基础研究需要,不好找工作就转行了

毫无疑问我只是一个新手,写出来的c估计有不合规范的地方,可是就SEL这个code 和
position requirement,不至于被这样据吧?
以前也不是没有收到rej,rej不给feedback也很正常是可以接受的,但是这次被这样一
个小白HR intern耍了,真的很不爽。
新手虚心请教板上各位老师傅,我写这个code是不是哪里有大问题我没有找出来?外国
人是不是投小公司的职位一般都没戏,应该专心刷leetcode?
avatar
a*n
2
Your uses extra memory in your code but the requirement is without extra
memory.
avatar
l*u
3
without using a second string for temporary storage.
你的code又是strdup又是char buf[count],用了太多extra storage吧
avatar
l*i
4
Frankly speaking, when I see your code, I can tell the code is written by
green hand, for example: use puts not printf... You use too many built-in
functions for string manipulation. Actually, it is a very straight-forward
algorithm.
It is hard to say specifically, but if I am the interviewer, I will deny the
application.
avatar
l*u
5
如果是我就会这么写:
void translate(char *str)
{
// edge case
if (str == NULL || strlen(str) < 2)
return;
// replace 'AB' to 'C0'
int len = strlen(str);
for (int i = 0; i if (str[i] == 'A' && str[i+1] == 'B') {
str[i] = 'C';
str[i+1] = 0;
}
}
// remove all '0'
int i = 0, j = 0;
while (j < len) {
if (str[j] == 0)
j++;
else {
str[i++] = str[j++];
}
}
// trim the tail
str[i] = 0;
}
avatar
e*o
6
你是新手,人家招老手,据你也说不上啥。
你基础是有了,可要课不要。
继续找吧,碰到愿意要新手的你就可以了。
avatar
s*e
7
谢谢您指出来这个问题,是当时我没注意到这一点,我当时应该shifting来做

【在 a*******n 的大作中提到】
: Your uses extra memory in your code but the requirement is without extra
: memory.

avatar
s*e
8
是我的错,当时没有没细看这个extra storage的要求,30分钟求快做出来,谢谢您指
出来这个问题

【在 l****u 的大作中提到】
: without using a second string for temporary storage.
: 你的code又是strdup又是char buf[count],用了太多extra storage吧

avatar
s*e
9
谢谢你,是我的错,我应该端正态度,继续努力

【在 e*******o 的大作中提到】
: 你是新手,人家招老手,据你也说不上啥。
: 你基础是有了,可要课不要。
: 继续找吧,碰到愿意要新手的你就可以了。

avatar
s*e
10
谢谢你赐教,看完你这个code,我非常认同大家的评论,我既没有注意到extra memory
,不该用built-in function的地方我用了,该用strlen我却没用搞了一个strdup出来

【在 l****u 的大作中提到】
: 如果是我就会这么写:
: void translate(char *str)
: {
: // edge case
: if (str == NULL || strlen(str) < 2)
: return;
: // replace 'AB' to 'C0'
: int len = strlen(str);
: for (int i = 0; i : if (str[i] == 'A' && str[i+1] == 'B') {

avatar
s*r
11
最简单的做法,scan 一次string,两个pointer。一个当前,一个当前可写,如果当前
不是A而两个pointer所指的值不同,写入当前可写,如果相同则不写。
如果当前是A,lookahead for B,如果不是B,把A写入当前可写入。如果是B,当前可
写为C。可写入每次进一,当前进一或者二,直到当前为末尾,可写改为末尾
现在刷题刷的,码农的基本修养不行啊

string

【在 s*****e 的大作中提到】
: update:
: 谢谢板上各位老师傅,现在我知道是我的问题了,“without using a second string
: ”我没有理解好,感谢大家赐教,我继续努力!
: 刚刚解决身份问题,男,找工作和leetcode都有一段时间了,最近碰到这家公司的一个
: 面试
: http://stackoverflow.com/jobs/115265/software-engineer-networking-schweitzer-engineering?searchTerm=SEL&offset=3&sort=s
: 问的问题和glassdoor一样,所以我也准备了一下那个unions的答案和例子,以前没用
: 这个:
: Interview Questions
: 1) What is in the software requirements?

avatar
f*n
12
void translate(char *str)
{
char *s, *d;
if (!str)
return;
d = s = str;
while (*s) {
if (*s == 'A' && *(s+1) == 'B') {
*d++ = 'C';
s += 2;
} else {
*d++ = *s++;
}
}
*d = 0;
}
avatar
l*g
13
从各位的答案中可以看出即便一道题,每个答案之间还是有差距的。所以即便面试感觉
良好,也不能代表什么,不是所有人都想着黑你的
avatar
O*i
14
*(s+1)未作越界检查?

【在 f****n 的大作中提到】
: void translate(char *str)
: {
: char *s, *d;
: if (!str)
: return;
: d = s = str;
: while (*s) {
: if (*s == 'A' && *(s+1) == 'B') {
: *d++ = 'C';
: s += 2;

avatar
O*i
15
额,假定str是 '\0' 结束的字符串应该是可行的。
avatar
f*n
16
是的呢^_^
[在 Otpisani (黑名单上的人) 的大作中提到:]
:额,假定str是 '\0' 结束的字符串应该是可行的。
avatar
l*u
17
java这样写(当然不是指针,而是相对应的数组)会报错indexoutofbound,c貌似没有
啥问题

:额,假定str是 '\0' 结束的字符串应该是可行的。

【在 O******i 的大作中提到】
: 额,假定str是 '\0' 结束的字符串应该是可行的。
avatar
j*8
18
把ab换成c,凭直觉就能做的,根本不需要算法,注意一下边界条件就可以,你写这么一
堆乱七八糟的,我如果是面试官,扫一眼就剧了

string

【在 s*****e 的大作中提到】
: update:
: 谢谢板上各位老师傅,现在我知道是我的问题了,“without using a second string
: ”我没有理解好,感谢大家赐教,我继续努力!
: 刚刚解决身份问题,男,找工作和leetcode都有一段时间了,最近碰到这家公司的一个
: 面试
: http://stackoverflow.com/jobs/115265/software-engineer-networking-schweitzer-engineering?searchTerm=SEL&offset=3&sort=s
: 问的问题和glassdoor一样,所以我也准备了一下那个unions的答案和例子,以前没用
: 这个:
: Interview Questions
: 1) What is in the software requirements?

avatar
T*e
19
没仔细看。应该是replace space的变形。
Leetcode, cc150等等都有这题。

string

【在 s*****e 的大作中提到】
: update:
: 谢谢板上各位老师傅,现在我知道是我的问题了,“without using a second string
: ”我没有理解好,感谢大家赐教,我继续努力!
: 刚刚解决身份问题,男,找工作和leetcode都有一段时间了,最近碰到这家公司的一个
: 面试
: http://stackoverflow.com/jobs/115265/software-engineer-networking-schweitzer-engineering?searchTerm=SEL&offset=3&sort=s
: 问的问题和glassdoor一样,所以我也准备了一下那个unions的答案和例子,以前没用
: 这个:
: Interview Questions
: 1) What is in the software requirements?

avatar
d*f
20
你这code太吓人了,就算条件看明白了,你这种写法who敢review阿

string

【在 s*****e 的大作中提到】
: update:
: 谢谢板上各位老师傅,现在我知道是我的问题了,“without using a second string
: ”我没有理解好,感谢大家赐教,我继续努力!
: 刚刚解决身份问题,男,找工作和leetcode都有一段时间了,最近碰到这家公司的一个
: 面试
: http://stackoverflow.com/jobs/115265/software-engineer-networking-schweitzer-engineering?searchTerm=SEL&offset=3&sort=s
: 问的问题和glassdoor一样,所以我也准备了一下那个unions的答案和例子,以前没用
: 这个:
: Interview Questions
: 1) What is in the software requirements?

avatar
g*y
21
最后需要free(d+1)后面的内存?

【在 f****n 的大作中提到】
: void translate(char *str)
: {
: char *s, *d;
: if (!str)
: return;
: d = s = str;
: while (*s) {
: if (*s == 'A' && *(s+1) == 'B') {
: *d++ = 'C';
: s += 2;

avatar
f*n
22
不需要,也不能从后面free,只能从头free,内存头在最前面。
也不能realloc, 因为入参是指针,不是指针的指针,改了外面就没法free了。

【在 g**********y 的大作中提到】
: 最后需要free(d+1)后面的内存?
avatar
l*u
23
都没有alloc 内存,为什么要free啊?就因为AB换成C节省了几个bytes?

【在 g**********y 的大作中提到】
: 最后需要free(d+1)后面的内存?
avatar
c*3
24
看了半天题目,没看见不让用strlen啊,你还用strdup去分配内存来计算count
“without using a second string for temporary storage. ”,你以为char buf[
count]就不算string了?
最后的拷贝最狠,清空整个src[],然后做strcpy,难道不知道strcpy带结尾0赋值能力
?完全是多余的运算
本来一个简单strstr+memmove搞定的小程序,你自己看看用了多少字符串操作,而且中
间src重来不移动,每次循环都是从头扫描到尾部,不挂就没天理了...
avatar
s*r
25
然,咋能瞎free呢,没有地址对齐,会crash。谁知道进来的指针是stack上的还是heap
上的
这年头C不行了,指针的修养也不行了,应该只有老码农还知道啥叫指针

【在 f****n 的大作中提到】
: 不需要,也不能从后面free,只能从头free,内存头在最前面。
: 也不能realloc, 因为入参是指针,不是指针的指针,改了外面就没法free了。

avatar
l*u
26
我记得一位老马工的名言是“有多少malloc就有多少free”,所以没有malloc直接free
,为了省这几个字节程序都要crash

heap

【在 s*****r 的大作中提到】
: 然,咋能瞎free呢,没有地址对齐,会crash。谁知道进来的指针是stack上的还是heap
: 上的
: 这年头C不行了,指针的修养也不行了,应该只有老码农还知道啥叫指针

avatar
f*n
27
是阿,招人的地方也少,会的人也不多了。

heap

【在 s*****r 的大作中提到】
: 然,咋能瞎free呢,没有地址对齐,会crash。谁知道进来的指针是stack上的还是heap
: 上的
: 这年头C不行了,指针的修养也不行了,应该只有老码农还知道啥叫指针

avatar
s*e
28
这个,基本功还是有一定问题的。

【在 e*******o 的大作中提到】
: 你是新手,人家招老手,据你也说不上啥。
: 你基础是有了,可要课不要。
: 继续找吧,碰到愿意要新手的你就可以了。

avatar
s*e
29
这个确实写得很差,可是leetcode不刷,感觉没有希望啊。投了3个月,小公司基本不
回,大公司有面试leetcode不过关。之前主要用python面试,我是不是应该改用c++? c
在leetcode上很少有讨论的,c++巨多,毕竟考code challenge的公司,目前为止都是
考c或者c++

【在 s*****r 的大作中提到】
: 最简单的做法,scan 一次string,两个pointer。一个当前,一个当前可写,如果当前
: 不是A而两个pointer所指的值不同,写入当前可写,如果相同则不写。
: 如果当前是A,lookahead for B,如果不是B,把A写入当前可写入。如果是B,当前可
: 写为C。可写入每次进一,当前进一或者二,直到当前为末尾,可写改为末尾
: 现在刷题刷的,码农的基本修养不行啊
:
: string

avatar
f*n
30
第一选择是Java吧

c

【在 s*****e 的大作中提到】
: 这个确实写得很差,可是leetcode不刷,感觉没有希望啊。投了3个月,小公司基本不
: 回,大公司有面试leetcode不过关。之前主要用python面试,我是不是应该改用c++? c
: 在leetcode上很少有讨论的,c++巨多,毕竟考code challenge的公司,目前为止都是
: 考c或者c++

avatar
w*x
31
这个“char buf[count];”最要命,count稍微大一点stack就乱掉了,然后程序就直接
crash了
avatar
j*g
32
审题不仔细。
看代码感觉你的思路还不是programming的思路。个人建议。把《The C Programming
Language》过一遍,再回过头来看看你的这些C代码就知道该怎么提高了。
如果你不是一定要做embedded和distributed system,还是挑个java,python吧。要招C
programmer的肯定需要熟悉底层。

string

【在 s*****e 的大作中提到】
: update:
: 谢谢板上各位老师傅,现在我知道是我的问题了,“without using a second string
: ”我没有理解好,感谢大家赐教,我继续努力!
: 刚刚解决身份问题,男,找工作和leetcode都有一段时间了,最近碰到这家公司的一个
: 面试
: http://stackoverflow.com/jobs/115265/software-engineer-networking-schweitzer-engineering?searchTerm=SEL&offset=3&sort=s
: 问的问题和glassdoor一样,所以我也准备了一下那个unions的答案和例子,以前没用
: 这个:
: Interview Questions
: 1) What is in the software requirements?

avatar
s*e
33
什么叫stack乱掉?mq_send()里面也是有一个char *的parameter,如果不用char []
statically allocate memory,用malloc/caaloc么?这样的话后面要free,这是比较
好的做法么?好在哪里?
有些时候这个char*会pass 到人家implement的function,pass之后可能不好free,比
如server side。
一般server side能做到memory leak free 么?还是很多时候只能做到fixed amount
of memory leak?

【在 w***x 的大作中提到】
: 这个“char buf[count];”最要命,count稍微大一点stack就乱掉了,然后程序就直接
: crash了

avatar
l*u
34
stack为什么会乱掉啊,stack占用的内存在函数结束后自动释放了啊

【在 w***x 的大作中提到】
: 这个“char buf[count];”最要命,count稍微大一点stack就乱掉了,然后程序就直接
: crash了

avatar
e*o
35
stack size limit

【在 l****u 的大作中提到】
: stack为什么会乱掉啊,stack占用的内存在函数结束后自动释放了啊
avatar
e*o
36
新手 培训一下就好了

【在 s******e 的大作中提到】
: 这个,基本功还是有一定问题的。
avatar
l*u
37
这个略牵强吧
一个字符串让stackoverflow,这字符串得多大。。。

【在 e*******o 的大作中提到】
: stack size limit
avatar
f*n
38
常见的事情,我都遇到好多回了。
比如有一次创建线程,为了省空间,把stack设置得比较小,1M,另外一个哥们直接
stack里面留1M的数组,跑啊跑啊就crash了,找了好半天才找到问题。

【在 l****u 的大作中提到】
: 这个略牵强吧
: 一个字符串让stackoverflow,这字符串得多大。。。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。