豌豆荚前端面试中的一个算法题
豌豆荚的前端面试,去了先要做题,而且题目并不是一般的基础题,最后一题是算法,我觉得有点意思,回来还和几个好友交流沟通了一下。
先说下题目:
A,B两个数据,A递增数组,B递减数组。找出A、B两个数组中交集的第K大个元素。
要求有好几条,我只记得一个了,就是不能用多余的存储。
既然要找第K大的元素,A本身又是递增的,可以利用A来做文章。
在A和B里进行循环,找到相同的元素就记录一次,这样,到第K次的 岂不就是第K大的元素啦(A本身是递增的~~)
OK,应该就是这个思路。
function getKnunmber(A,B,k){ var n = 0; var lena = A.length; var lenb = B.length; var knum; var arr = []; for(var i=0; i<lena; i++){ for(var j=0; j<lenb; j++){ if(A[i] == B[j]){ debugger; if(n == k){ knum = A[i]; return knum; }else{ n++; break; } } } }
}
这里有一个问题,就是双重for循环的时候,如何跳出?
我在最初调试代码的时候发现,如果在里面的for循环中break,只能跳出当前的for循环,却跳不出外部的for循环。在网上并没有找到什么好的解决方案。后来,改用return,在chrome下debugger调试的时候发现,竟然可以直接跳出整个for循环。好用的return.
找个例子试一下:
var A = [3,4,5,6,7,8,9]; var B = [12,10,9,8,7,1]; var n = getKnunmber(A,B,1); console.log(n)
可以正常执行啦。
其实连knum这个变量都是多余的,又改了一下,具体的演示地址:http://jsbin.com/lexaq/7/edit