解决技术测试时最重要的事情是不要使用捷径——他们想看看你在算法上是如何思考的!不是你使用的方法。
这是我想出的一个(在我通过测试后 45 分钟)。不过,还有一些优化需要做。在编写任何算法时,false
如果它看起来是,最好假设并更改逻辑true
。
isPalindrome()
:
基本上,要使其以O(N)(线性)复杂度运行,您需要 2 个迭代器,它们的向量相互指向。意思是,一个从开头开始的迭代器和一个从结尾开始的迭代器,每个迭代器都向内移动。您可以让迭代器遍历整个数组并使用条件 to break
/return
一旦它们在中间相遇,但默认情况下只为每个迭代器提供一半长度可能会节省一些工作。
for
循环似乎强制使用更多检查,所以我使用了while
循环——我不太习惯。
这是代码:
/**
* TODO: If func counts out, let it return 0
* * Assume !isPalindrome (invert logic)
*/
function isPalindrome(S){
var s = S
, len = s.length
, mid = len/2;
, i = 0, j = len-1;
while(i<mid){
var l = s.charAt(i);
while(j>=mid){
var r = s.charAt(j);
if(l === r){
console.log('@while *', i, l, '...', j, r);
--j;
break;
}
console.log('@while !', i, l, '...', j, r);
return 0;
}
++i;
}
return 1;
}
var nooe = solution('neveroddoreven'); // even char length
var kayak = solution('kayak'); // odd char length
var kayaks = solution('kayaks');
console.log('@isPalindrome', nooe, kayak, kayaks);
请注意,如果循环计数结束,则返回true
. 所有逻辑都应该反转,以便默认返回false
。我也使用了一种捷径方法String.prototype.charAt(n)
,但我觉得这没问题,因为每种语言都支持这种方法。