基础算法题
1、数组去重的方式
// 数组去重实现得四种方式 let arr = [1,3,1,5,6,8,1,2,3,6] // 1、利用set() arr = [...new Set(arr)] arr = Array.from(new Set(arr)) // 2、使用includes/indexOf (也可以自己和自己比较不定义新的数组,将重复的值设置为Null,到最后之后,通过filter将null过滤掉/ 将最后一个值和当前替换,长度减一,循环也减一也可以实现,并且数组之后得下标不会发生变化) let arr2 = [] for(let i = 0; i < arr.length - 1; i++) { // if(arr2.indexOf(arr[i]) <= -1) { // arr2.push(arr[i]) // } let current = arr[i] let otherArr = arr.slice(i + 1) if(otherArr.indexOf(current) > -1) { arr[i] = arr[arr.length - 1] arr.length-- i-- } } // 3、利用对象的键名不重复 // 3-1 let obj = {} for(let i = 0; i < arr.length; i++) { obj[arr[i]] = arr[i] } // 3-2 let obj = {} for(let i = 0; i < arr.length; i++) { if(obj[arr[i]] !== undefined) { arr[i] = arr[arr.length - 1] arr.length-- i-- continue } obj[arr[i]] = arr[i] } //4利用正则
2、排序
//基础排序算法 // 冒泡排序 快速排序 插入排序 // 1、 let sortArr = [3, 5, 6,1,4,2, 2,10,8] // 排序 sortArr.sort((a, b) => a - b) // 可实现排序 // 2、冒泡 for(let i = 0; i < sortArr.length - 1; i++) { for(let j = 0; j < sortArr.length - i -1; j++) { if(sortArr[j] > sortArr[j + 1]) { [sortArr[j], sortArr[j + 1]] = [sortArr[j + 1], sortArr[j]] } } } // 3、插入排序 let arr = [3, 1, 2, 123, 53, 123, 45, 49,66] let tempArr = [arr[0]] for(let i = 1; i < arr.length; i++) { for(let j = tempArr.length - 1; j >= 0; j-- ) { if(arr[i] < tempArr[j]) { if(j === 0) { tempArr.splice(0,0, arr[i]) break } else { continue } } else { tempArr.splice(j+1,0,arr[i]) break } } console.log(tempArr) } // console.log(tempArr) // 快速排序 function sortQuick(arr) { console.log(arr) if(arr.length <= 1) return arr let leftArr = [] let rightArr = [] let minIndex = Math.floor(arr.length / 2) let minValue = arr[minIndex] arr.splice(minIndex, 1) for (let i = 0; i < arr.length; i++) { if(arr[i] > minValue) { rightArr.push(arr[i]) } else { leftArr.push(arr[i]) } } // console.log(sortQuick(leftArr).concat(minValue, rightArr)) return sortQuick(leftArr).concat(minValue, sortQuick(rightArr)) }
3、数组扁平化
// 数组扁平化 let mutilArr = [ [1], [2], [[3],[7], [[4, 5], 6]] ] // 1、 es6中提供得Array.prototype.flat处理 mutilArr = mutilArr.flat(Infinity) // 2、通过toString mutilArr = mutilArr.toString().split(',').map((item) => {return parseFloat(item)}) // 3、通过JSON.stringify再通过正则匹配replace替换掉[]符号 console.log(mutilArr) // 4、通过some和扩展运算符 while (mutilArr.some(item => Array.isArray(item))) { mutilArr = [].concat(...mutilArr) // 每执行一次扩展运算符则去一层 } // 5递归 function mutil(arr) { let result = [] let fn = function (newArr) { for(let i = 0; i < newArr.length; i++) { if(Array.isArray(newArr[i])) { fn(newArr[i]) } else { console.log(newArr[i]) result.push(newArr[i]) } } } fn(arr) return result }
4、斐波那契数列
// 斐波那契数列 //[1,1,2,3,5, 8] function fibonacci(n) { let arr = [1, 1] if(n <= 1) return 1 for(let i = 2; i <= n; i++) { arr.push(arr[arr.length - 1] + arr[arr.length - 2]) } return arr[arr.length - 1] } // 使用递归实现 function recFibonacci(n) { function fn(m, cur = 1, next = 1) { if(m === 0) { return cur } else { return fn(m-1,next, cur + next) } } return fn(n) }
5、
// 字节笔试题
/*
* 输入一个正数N,输出所有和为N的连续正数数列
* 例如输入15
* 结果:[[1,2,3,4,5], [4,5,6],[7, 8]]
* */
function contiguousArray(n) { let result = [] let lastIndex = Math.ceil(n / 2) // 取中间数(向上) 当第1个数为中间数.后面不会有连续的数相加这个中间会等于n for(let i = 1; i < lastIndex; i++) { if(resultArr(i, n)) { result.push(resultArr(i, n)) } else { continue } } return result } function resultArr(m, n) { let result = 0 let arr = [] for(let i = m;;i++) { arr.push(i) result += i if(result === n) return arr if(result > n) return false } }