西西河

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

共:💬30 🌺11
分页树展主题 · 全看首页 上页
/ 2
下页 末页
  • 家园 【原创】如何REVERSE一个C STRING?

    我有个朋友面试遇到了这个问题来问我,我做了一阵没做出来.关键是还有个附加要求,不得使用任何函数和临时变量, 也就是说reverse_string(char *p)里面唯一能出现的变量就是p,不能有str_len之类的函数和INT INDEX之类的临时变量,也不能出现reverse_string之外的函数.

    我知道用递归可以把它反向显示出来(这显示出来其实已不对了,因为要用PUTCHAR),但没办法把它放回p.

      • -- 系统屏蔽 --。
    • 家园 这问题最近先后出现在CISCO,ERICSSION,F5的面食中

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

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

    • 家园 至少要一个临时变量吧!

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

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

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

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

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

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

      • 家园 complier自己安排的不算。
        • 家园 请看http://www.cchere.com/article/

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

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

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

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

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

            他们就是玩呀。

    • 家园 想起来SICP里有道练习题就是这个

      用LISP的方法来做的话一般都是用尾递归的

      不过C好像无法不用临时变量模拟cdr

    • 家园 哈,我也问个算法。。。

      前些天算两个7两个4(+-*/),怎么让它等于24,便想写个code:

      任意给4个数,输出是否等于24,如果等于,给出怎么得到的结果。

      忙活了半天,没有一个自己满意的算法和code,现请教一下,给个算法就行,谢谢了。 (不喜欢删掉好了)


      本帖一共被 1 帖 引用 (帖内工具实现)
      • 家园 这个我以前写过

        思路是生成所有可能的四则运算表达式树,然后依次检查结果。

        可以用逆波兰方式来表达,这样不用考虑括号和优先级的问题

        需要注意的是,有时候中间结果非整数,可能要用写一个有理数类来存放结果。

        • 家园 太谢谢了

          考试太忙,匆匆献花。

          小弟不是学计算机的,逆波兰这个算法第一次听说,要搞懂得花些时日(哈,俺是出了名的慢)。不过听你介绍,不用考虑不用考虑括号和优先级的问题,确实是我需要的算法!日后还要请教。

    • 家园 这东西,说的是不用什么临时变量。。。

      帝归起来,用的空间多多了。。。

    • 家园 说到递归,我就想出来了

      叙述算法太麻烦,举例吧,一看就明白

      12345

      15432 -- 递归

      51432 -- 交换前两个

      51234 -- 再递归

      54321 -- 再再递归

      不用额外变量交换两个变量的值,相信您会的哦?

      update: 才看到楼下的,比我的简单,更重要的是复杂度好多了。

分页树展主题 · 全看首页 上页
/ 2
下页 末页


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

Copyright © cchere 西西河