js常用算法面试题收集
1.统计一个字符出现的最高频率?
let str = 'asdfghjklaqwertyuiopiaia';
function statistics(str){
const strArr = [...str]
let obj = {}
// 统计字符数
strArr.forEach((i) =>{
obj[i] = obj[i] == undefined ? 0 : ++obj[i]
})
// 求最大值
return Object.keys(obj)
.sort((i, r) => obj[r] - obj[i])[0] //降序排列
}
console.log(statistics(str)) // a
2.数组去重
- ruduce 方法
let arr = ['1', '2', '3', '1', 'a', 'b', 'b']
function duplicate() {
return arr.reduce((r,v) => r.indexOf(v) > -1 ? r : [...r, v], [])
}
console.log(duplicate())
- forEach
let arr = ['1', '2', '3', '1', 'a', 'b', 'b']
const unique = arr => {
let obj = {}
arr.forEach(value => {
obj[value] = 0
})
return Object.keys(obj)
}
console.log(unique(arr)) // ['1','2','3','a','b']
- filter
let arr = ['1', '2', '3', '1', 'a', 'b', 'b']
const unique = arr => {
return arr.filter((ele, index, array) => {
return index === array.indexOf(ele)
})
}
console.log(unique(arr)) // ['1','2','3','a','b']
- set
let arr = ['1', '2', '3', '1', 'a', 'b', 'b']
const unique = arr => {
return new [...Set(arr)]
}
console.log(unique(arr)) // ['1','2','3','a','b']
3、翻转字符串
let str = 'holle word'
const reverseStr = str => {
return [...str].reverse().join('')
}
console.log(reverseStr(str))
4、数组中最大差值
let arr = [2,44,22,8,9]
const different = arr => {
let sortArr = arr.sort((i,r) => i-r)
return sortArr[sortArr.length - 1] - sortArr[0]
}
console.log(different(arr))
5、不借助临时变量,进行两个整数的交换
- 数组解构
let a = 2,
b = 3;
[b,a] = [a,b]
console.log(a,b) // 3 2
- 算术运算(加减)
let a = 2,
b = 3;
const swop = (a, b) => {
b = b - a;
a = a + b;
b = a - b;
return [a,b];
}
console.log(swop(2,3)) // [3,2]
6、冒泡排序
let arr = [43, 32, 1, 5, 9, 22];
const sort = arr => {
arr.forEach((v, i) => {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
[arr[i],arr[j]] = [arr[j],arr[i]]
}
console.log(arr)
}
})
return arr
}
console.log(sort([43, 9, 5, 22, 32, 1])) // [1, 5, 9, 22, 32, 43]
7、分割数组
题目:给一个形如['', 1, 2, '', '', 6, 7, 8]
的数组,里面需要分割成[[1,2], [6,7,8]]
的形式
// 分割' ',双指针法
function separate(arr) {
let pre = 0 //前节点
let cur = 0 // 当前节点
let res = []
let _arr = [...arr.slice(0), ''] //加入一个'',作为结尾,兼容结尾为数字的情况
while(cur < _arr.length) {
// 前后节点一致的情况,遇到''跳过
if(_arr[pre] === '' && _arr[cur] === '') {
pre++
cur++
continue
}
// 前后节点不一致的情况一,都不为空串,只移动cur,相当于记录pre
if(_arr[pre] !== '' && _arr[cur] !== '') {
cur++
continue
}
// 前后节点不一致的情况二,cur遇到空串,表示到了分割点,加入区间[)到数组
if(_arr[pre] !== '' && _arr[cur] === "") {
res.push(_arr.slice(pre, cur))
cur++
pre = cur
}
}
return res
}
console.log(separate(['', 1, 2, '', '', 6, 7, 8]))
console.log(separate([0, 1, 2, '', '', 6, 7, '']))
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1249118795@qq.com