一次面试引起的思考
在一次面试中曾被问到这样一个问题,如何判断字符串是否是回文,要求写一个函数,语言不限。我当时一听心中一阵窃喜,js的数组中不正好有一个reverse函数吗?这不正好可以用于解这道题吗?于是乎我很快就写了含有str.split('').reverse().join('')
这样的代码。面试官面带疑惑的问我这么快就写完了?在看了我的代码之后,笑着说:“那我要是让你写一个排序,你是不是要用sort这个方法呢?”,当时就有点不好意思了。对啊,面试官估计不是想考我是否知道有这样的方法。所以我赶紧重新写了一个思路也很简单的,大概是在函数中新建了一个array,然后按照从尾到头的顺序依次push原字符串split之后的结果中的每一项,最后再用array.join的方法产生了新的字符串,将新旧字符串进行===比较之后可得结论。给面试官看了之后也没说什么,只是告诉我说如果用指针的话会很简单。
可是JavaScript中似乎没有指针的用法
面试最终宣告失败。可是我还是对面试官所说的“用指针的方法会很简单”这句话念念不忘。在网上搜索了一下,好像js确实与c中指针的用法关系不大,只好作罢,然后我在网上想看看reverse函数是怎么实现的,看到有的答案是这样的:
function reverse(arr){
for(var i = 0;i < arr.length/2; i++){
var temp = arr[i]; //替换数组中相对称的两项
arr[i] = arr[arr.length - i - 1];
arr[arr.length-i-1] = temp;
}
}
上面的代码看起来很简单,但又和我们常见的想法有一点差异。常见的想法如上文所写的那样需要创建一个新的数组来将存储原数组处理后的结果然后再做比较。可是上面这段代码却直接观察数组中的对应项颠倒的规律(将第i项和第(arr.length-i-1)项交换位置)。当然,这只是一个参数为数组的reverse函数,如果要想应用于解决字符串是否是回文的问题还需要做一点修改。
这一次用c的写法
恰好前不久老师讲了js如何判断字符串是否为回文的问题,同时又想知道面试官的那句话到底是什么意思。我还是去看了看C语言的指针部分那一小节,但是想了好久对于那一小节中的左值和右值的概念还是不太清楚,然后恰好这一节有翻转字符串的一个参考代码,如下:
void reverse_string( char * str)
{
char * last_char;
for(last_char = str; *last_char != '\0'; last_char++)
;
last_char--;//因为C语言中系统对字符串常量自动加一个'\0'作为结束符,所以循环结束后last_char指向的是作为终止符的字节,所以这里做了--处理。
while( str < last_char){
char temp;
temp = *str;
*str++ = *last_char;
*last_char-- = temp;
}
}
由于我对c中字符串还不太熟悉,上面的代码具体怎么使用还不得而知。(比如c中一个字符串常量出现在表达式当中时,表达式所使用的值是这些字符串存储的地址而不是这些字符串本身,所以还不太清楚如何去比较两个字符串是否相等。QAQ。
总结
你可以把这篇短文看作我不务正业的结果,我只是真的想去看看面试官所说的会指针的话就简单多了是有多简单。之前看到《JavaScript语言精粹》一书中说“JavaScript是披着C外衣的Lisp”,第一眼感觉js应该和c比较像吧,可是终究还是不明白这句话的意思。而且忠告大家,在js还没学透彻的时候去看其他语言可能有副作用。。。就像我现在好像对js感到陌生了一样。以后还是继续研究js吧。
文章著作权归Archer和饥人谷所有,转载需说明来源