主题:【原创】如何REVERSE一个C STRING? -- 老成都
我有个朋友面试遇到了这个问题来问我,我做了一阵没做出来.关键是还有个附加要求,不得使用任何函数和临时变量, 也就是说reverse_string(char *p)里面唯一能出现的变量就是p,不能有str_len之类的函数和INT INDEX之类的临时变量,也不能出现reverse_string之外的函数.
我知道用递归可以把它反向显示出来(这显示出来其实已不对了,因为要用PUTCHAR),但没办法把它放回p.
如果P或者P+1为0,直接返回
否则递归处理P+1;
然后用循环将P依次后移1位,直到遇到0为止
返回P
叙述算法太麻烦,举例吧,一看就明白
12345
15432 -- 递归
51432 -- 交换前两个
51234 -- 再递归
54321 -- 再再递归
不用额外变量交换两个变量的值,相信您会的哦?
update: 才看到楼下的,比我的简单,更重要的是复杂度好多了。
void reverse(char *p)
{
if(p[0]=='\0') return;
if(p[1]=='\0') return;
if(p[2]!='\0') reverse(p+1);
while(p[1]!='\0') {
p[0]=p[0]+p[1];
p[1]=p[0]-p[1];
p[0]=p[0]-p[1]; //switch.
p++;
}
}
调试已经通过,
"然后用循环将P依次后移1位,直到遇到0为止" 我费了好一会儿才明白.
帝归起来,用的空间多多了。。。
前些天算两个7两个4(+-*/),怎么让它等于24,便想写个code:
任意给4个数,输出是否等于24,如果等于,给出怎么得到的结果。
忙活了半天,没有一个自己满意的算法和code,现请教一下,给个算法就行,谢谢了。 (不喜欢删掉好了)
本帖一共被 1 帖 引用 (帖内工具实现)
思路是生成所有可能的四则运算表达式树,然后依次检查结果。
可以用逆波兰方式来表达,这样不用考虑括号和优先级的问题
需要注意的是,有时候中间结果非整数,可能要用写一个有理数类来存放结果。
用LISP的方法来做的话一般都是用尾递归的
不过C好像无法不用临时变量模拟cdr
考试太忙,匆匆献花。
小弟不是学计算机的,逆波兰这个算法第一次听说,要搞懂得花些时日(哈,俺是出了名的慢)。不过听你介绍,不用考虑不用考虑括号和优先级的问题,确实是我需要的算法!日后还要请教。
Does your code really work?
Which compiler are you using and on which platform, Windows? Unix?
I tried your code using Visual C++ 6.0 on Windows and got an access violation for the following line as expected:
p[0] = p[0] + p[1];
Bigbug
you need to pass a char[], you can not pass "hello the world" directly, you need to scan a string to a char buffer.
My environment is gcc/Linux.
Do you kown the difference for "char *p="hello the world" and the "char p[100]"?
My test code is something like
"
main()
{
char str[100],
scan("%s",str);
printf("original:%s\n",str);
reverse(str);
printf("reversed:%s\n",str);
}
"
It works fine. I guess you pass "hello the world" directly into the reverse function.
n factorial了吗?是不是原地reverse只能让时间复杂度增加到那么大?谢谢