Tag name:String

[LeetCode] Reverse Words in a String

03/10/2014 / 1 Comment

在进入正题之前先扯点别的,微软campus interview就被问的这题,当时写的不够好,主要面试官要求是char *参数,然后我std::string用多了之后根本搞不清,连strlen都忘了,然后竟然以为sizeof字符串/sizeof char 之后再减一能得到结果…实际上如果字符串是用char数组的话就可以,是char *的话sizeof一下得出的是指针的长度肯定不行,并且注意下面的代码

得出的结果, b为5,而c为3. 原因是char[]是会被编译器解析为char *的,所以参数类型 []和*并没有区别,都是当做*来看待,可以试试重载某一个函数,将其中的*换成[],或者[]换成*, 编译器会告诉你俩函数是同一个函数,func xxx already has a body.
再扯几个别的:(感觉其实都是特基础的东西,当时没学好啊!)
为什么写成5[a]也能访问到a[5]呢?忘记在什么地方看到了,后来自己试了一下果然可以,原因是x[y]会被解析成*(x+y),而[y]x自然就是*(y+x)所以就不会有区别了
可能有人觉得x[y]应该是*(&x[0]+y)才对,但实际上,数组本身作为右值的时候,被解析为数组第一个元素的指针,但左值则还是指整个数组的存储空间。可以看以下例子:

Ok下面完整的题(我面试的时候面试官也只给了模糊的条件,得确认string是什么string, 要不要删多余空格等等)
Given an input string, reverse the string word by word.

For example,
Given s = “the sky is blue”,
return “blue is sky the”.

Clarification:
What constitutes a word?
A sequence of non-space characters constitutes a word.
Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces.
How about multiple spaces between two words?
Reduce them to a single space in the reversed string.

这里我写成了俩函数,java里的string有个trim()所以我就想着也写一个,实际上,在trim的时候,对于空格的位置已经是查找过的了,所以在第二次reverse的时候完全可以借用位置信息,当然这又是空间换时间的问题了。
由于LeetCode上给的输入参数是std::string,所以我也就偷个懒直接调用std::reverse了,有时间再写个偏纯C的,不过纯C挺蛋疼!