西西河

主题:【原创】如何REVERSE一个C STRING? -- 老成都

共:💬30 🌺11
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 有那么高吗?n平方吧?我的倒是指数增长的
家园 至少要一个临时变量吧!

否则用递归好像也没法做。

再说递归比用临时变量,无论从时间上还是空间上消耗的更多啊!

家园 这比用一个临时变量,记住长度效率差多了

void reverse(char *p)

{

int cnt = 0;

// calculate length

while (p[cnt] != 0) ++cnt;

while ((cnt>>1) > 0)

{

// switch first and the last

*p ^= p[cnt-1] ^= *p ^=p[cnt-1];

p++;

// cuz p moved forward, we have to minus 2

cnt -= 2;

}

}

您老看看,算长度,n, 交换位置1/2n,总共O(n)。只用一个临时变量。

递归算法,

1)要是N很大,stack就爆掉了,

2)而且每次调用函数,必须push ebp,调整ebp,压入参数,还要记住retern addr, jump回来,clean stack。浪费无数。

3)时间复杂度上,递归算法是O(n^2)

就为省一个临时变量。

现实生活中,谁要这么写程序,真可以直接fire了。出这种题的也应该fire,纯粹误导。


本帖一共被 1 帖 引用 (帖内工具实现)
家园 complier自己安排的不算。
家园 请看http://www.cchere.com/article/

http://www.cchere.com/article/1015920

家园 这问题最近先后出现在CISCO,ERICSSION,F5的面食中

要换工作的河友一定先把它背下来.

是的,编译器隐含的不算.

家园 说实在的,大部分面试编程题都是面试人在壮自己的胆,

要真的是高手,问十分钟就够了,那里用的着作题.

为什么要出题考你,不就是你干过的我不清楚,问多了自己都心虚,那就叫你先做题,你做不出来俺胆不就壮了?!

象这个题目,即使是合格的SENIOR在十分钟内也几乎不可能完全答出来.明显就是杀你的威风的.我不相信类似的题目在那些公司上班的人能随时做出来.

家园 这个当然是工作过的人的标准答案,没另外用个

数组,俺给99分,可惜俺没资格面食别人.

俺不给100分的原因是俺不喜欢SWAP的那部分,对公司里的菜鸟来说不易读.写成多行不要紧,好读,编译器自己会优化的:)

家园 把 int cnt 换成 char *end, 然后

while ((cnt>>1) > 0) 换成 while (end > p) 是不是更直观一些呢?

家园 有道理!花

用个char *end记住末尾更直观!

家园 哈哈。。你真认真。。

他们就是玩呀。

家园 在实际工作中,任何显式调用递归的都不是好方法,因为

这可能造成一些和资源有关的CRASH.比如这个调用递归的REVERSE,它可能对短的STRING可以,对长的CRASH. 她甚至可能对同样长的STRING有时CRASH有时不CRASH,取决于你掉它时的位置(这点在EMBEDDED的环境下特别重要),我完全同意你的看法.

问题是人家就这样把题出出来了.

家园 这道明显是brain teaser,又不是编程题,限制条件列得

明明白白,谁叫你优化时间空间了啊?不许用临时变量和额外函数的意义,不在于节省空间,而在于测试你在极端条件下能不能跳出陈腐框框,独辟蹊径。测试的是创造力。有规定说面试不许出智力题了吗?又有规定说智力题不许借用编程的语境了吗?

家园 花一个!问题是俺们这些老蓝领反应已经很慢了,

做这种题拼不过刚毕业的PHD.

我那朋友有三个面食碰到了这题,头一个面食没做出这题,后面两个都做出来了(从河上抄的答案),不过他还是没拿到OFFER.我其实知道他干活还可以,在华为时是某ROUTER的开发主力.

这就是IT残酷的一面,你永远得和很年轻的人竟争.

  • -- 系统屏蔽 --。
全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河