一道难倒不少前端面试者的问题

有一数组,里面有若干(数目和薪资一样多)数字,数字有重复,如何找出重复次数最多的数字


这个问题每次和组员面试时必问,其中能够理出逻辑过程的不到一半,大部分都是先声明一个空数组,然后经过数次循环对比处理,而首先声明空对象的不多(数据结构很重要呀!!!这是我们非科班的硬伤)。
常规答案如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let a = [1, 2, 6, 8, 9, 5, 2, 5, 6, 5, 5, 2, 5, 5];   
let numCount = {}, maxCountNum = 0, maxNum;
for (let i = 0, j = a.length; i < j; i++) {
if (a[i] in numCount) {
numCount[a[i]] += 1
} else {
numCount[a[i]] = 1
}
if (numCount[a[i]] > maxCountNum) {
maxNum = a[i];

maxCountNum=numCount[a[i]]

}

}
console.log(maxNum)

曾经看到有人说通过一句js代码就可以实现,只是这个地方太小,他写不下了。这句话怎么似曾相似呢。。。。

17世纪初,欧洲流传着公元三世纪古希腊数学家丢番图所写的《算术》一书。1621年,费马在巴黎买到此书并利用业余时间书中的不定方程进行了深入研究,从而创立了数论这门数学分支。在数论领域中,费马的巨大成果主要是费马大定理和费马小定理。其中以费马大定理最为著名。

1637年左右,费马在阅读丢番图《算术》的拉丁文译本时,曾在第11卷第8命题旁写道:“将一个立方数分成两个立方数之和,或一个四次幂分成两个四次幂之和,或者一般地将一个高于二次的幂分成两个同次幂之和,这是不可能的。关于此,我确信已发现了一种美妙的证法,可惜这里空白的地方太小,写不下。”

这就是著名的费马大定理:当整数n>2时,关于x,y,z的方程没有正整数解。
费马大定理也叫“费马最后的定理”,“最后”的意思是:其它猜想都证实了,这是最后一个。费马究竟有没有证明费马大定理,至今是人们津津乐道的话题。费马大定理被提出后,经历多人猜想辩证,历经三百多年的历史,才于1995年由英国数学家怀尔斯证明,且其证明的过程相当艰深。
费马大定理

话说回来,对于一行代码实现文章开头的问题,我开始是深信不疑的,然后今天尝试了一下,最后想法遭到了动摇。
在不声明其他变量的情况,我是这样写的:

1
2
let a = [1, 2, 6, 8, 9, 5, 2, 5, 6, 5, 5, 2, 5, 5];
a.map((value, index) => {if (index === 0) {a[a.length] = {};a[a.length - 1][value] = 1;a[a.length] = value} else {if (value in a[a.length - 2]) {a[a.length - 2][value] += 1;if (a[a.length - 2][value] > a[a.length - 1]) {a[a.length - 1] =value}}else {a[a.length - 2][value] = 1}}if(index+3===a.length)console.log(a[a.length-1])})

实际上面一行是伪代码,ctrl+Alt+L格式化一下,重新排版成酱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a.map((value, index) => {
if (index === 0) {
a[a.length] = {};
a[a.length - 1][value] = 1;
a[a.length] = value
} else {
if (value in a[a.length - 2]) {
a[a.length - 2][value] += 1;
if (a[a.length - 2][value] > a[a.length - 1]) {
a[a.length - 1] = value
}
} else {
a[a.length - 2][value] = 1
}
}
if (index + 3 === a.length) console.log(a[a.length - 1])
})

看起来更复杂了,有兴趣的小伙伴可以试一试,欢迎留言交流