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 } }