js常用算法面试题收集

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