找最大值、重复元素.md

一维数组中寻找最大值

let array=[……]

1、for循环遍历

for循环是最直接的方法,但也是时间复杂度最高的方法。O(n)

1
2
3
4
5
6
let array = [5, 7, 89, 2, 4]
let max = array[0];
for (let i = 0; i < array.length; i++) {
max = (max >= array[i]) ? max : array[i];
}
console.log(max); //89

2、Math.max

推荐的方法,但是要注意Math.max()对象中传递的单个参数,不能传递整个数组,此时便需要用apply方法将数据对象转化为单个参数对象。这种算法的时间负责度为多少??

1
2
3
let array = [5, 7, 89, 2, 4]
let max = Math.max.apply(array, array);
console.log(max); //89

但是在ES6中,有一个新的API,扩展运算符…,将一个数组转为用逗号分隔的参数序列,所以上式还有一个更简单的替代apply的方法

1
let max = Math.max(...array)

顺便可以区分一下apply、call、bind之间的区别。
call传递的是单个参数:call(this,arg1,arg2,arg3...)
apply可以传递的是一个数组: apply(this,arguments[])
bind只传递一个对象:bind(this)

3、Array.sort()排序之后再取最后一位

这个办法的时间复杂度就是视具体浏览器JS引擎以及数组长度而定了。

1
2
3
let array = [5, 7, 89, 2, 4]
let newArr= array.sort();
console.log(newArr[newArr.length-1]); //89

一维数组寻找重复率最高的元素

使用hash

让object.key=元素,value=出现次数,遍历对象,找到value中最大值,然后将对应的key值返回就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//找出数组中出现最多的元素
let arr = ['a', 'b', 'c', 'a', 'a', 'b'];
let res = {};

//遍历数组,生成keys
for (let i = 0; i < arr.length; i++) {
if (!res[arr[i]]) {
res[arr[i]] = 1
} else {
res[arr[i]]++;
}
}

//遍历对象,找出最大的值
//这里使用Object.keys遍历
let keys = Object.keys(res);
let maxNum = 0, max;
for (let i = 0; i < keys.length; i++) {
if (maxNum < res[keys[i]]) {
maxNum = res[keys[i]];
max = keys[i]
}
}
console.log(max)
使用空间换时间

找到找到字符串中出现频率最高的字符

这个问题和在数组中寻找出现频率最高的元素其实是同一个问题,区别在于,一个是字符,一个是数组。遍历的方式不一样而已。

对于for循环遍历,字符串具有length属性,上面的方法完全适用。