Created
May 24, 2014 23:57
-
-
Save jikeytang/a5c944f565f98be39c0e to your computer and use it in GitHub Desktop.
[ Javascript ] - 20140525-题目2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 | |
如:[2,2],2出现2次,数组长度的一半为1。 | |
[3,5,5,7],5出现2次,数组长度的一半为2,则为5。 | |
PS: | |
1. 回复时注意加上下面这句话,才会有语法高亮或格式缩进。 | |
```javascript | |
// you code | |
``` | |
2. 粘贴代码时请使用shift+tab,缩进前面的空白。 |
sunnylost
commented
May 25, 2014
楼上的有些问题的吧,比如
console.log(find([123, 2, 123, 1, 3, 123, 56, 123, 123, 124, 12]));
原因在于当出现[1, 2, 3]或[1, 23]或[12, 34]这样的顺序的时候,都会导致join("")之后出现123,影响结果
join()的时候使用一个符号,应该可以解决这个问题
function getNum(arr) {
var len = arr.length, half = len / 2, li = 0;
arr.sort(function(a, b){
return a - b;
});
for(var i = 0; i < len;) {
li = arr.lastIndexOf(arr[i]) + 1;
if (li - i >= half) {
return arr[i];
}
i = li;
}
return "";
}
getNum([2, 1, 2, 4, 2, 1, 4, 2, 1, 2, 1, 1, 1, 1]); // 1
楼上的答案已经OK了,如果非要像一楼那样用正则的话,可以像这样实现:
(function(arr){
var str = narr.sort().join(',')+',',l = Math.floor(narr.length/2)-1;
var reg = new RegExp('(\\d+\\,)\\1{'+l+',}','g');
return str.match(reg)[0].charAt(0); //1
})([2, 1, 2, 4, 2, 1, 4, 2, 1, 2, 1, 1, 1, 1]);
想的窄了 没考虑mailzwj提出的问题 mark了
这个和当时我面试入职时的算法题类似.
我的是, 重复数字的长度多于总个数的一半 -- 不一样的数字碰碰消除, 剩下的就是结果.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment