- 數(shù)組去重和排序的多種實(shí)現(xiàn)算法
let ary = [12,23,12,15,25,23,25,14,16];
// es6中的Set
let arr = [...new Set(ary)]
console.log(arr)
// es6中的Array.from
let arr = Array.from(new Set(ary))
console.log(arr)
// 循環(huán)的方式
let arr = []
for(let i = 0;i < ary.length;i++){
let item = ary[i],
args = ary.splice(i+1)
if(args.indexOf(item) == -1){
arr.push(item)
}
}
// 相鄰項(xiàng)的處理方案
ary.sort((a,b)=>a-b)
ary = ary.join('@')+'@'
let reg = /(\d+@\1*)/g,
arr = []
ary.replace(reg,(val,group1 => {
arr.push(Number(group1.slice(0,group1.length-1)))
arr.push(parseFloat(group1))
}))
// 冒泡排序
function bubble(ary){
let temp = null
for(let i = 0;i<ary.length-1;i++){
for(let j = 0;j<ary.length-1-i;j++){
if(ary[j] > ary[j+1]){
temp = ary[j]
ary[j] = ary[j+1]
ary[j+1] = temp
}
}
}
return ary
}
// 插入排序
function insert(ary){
// 準(zhǔn)備一個新數(shù)組吼旧,用來存儲抓到手里的牌虫腋,開始先抓一張牌進(jìn)來
let handle = []
handle.push(ary[0])
// 從第二項(xiàng)開始依次抓牌罪裹,一直到把臺面上的牌抓光
for(let i = 1;i < ary.length;i++){
// A是新抓的牌
let A = ary[i]
// 和手里的牌依次比較(從后向前比)
for(let j = handle.length-1;j>=0;j--){
// 每次要比較的手里的牌
let B = handle[j]
// 如果當(dāng)前新牌A比要比較的牌B大按厘,把A放到B的后面
if(A>B){
handle.splice(j+1,0,A)
break
}
// 已經(jīng)比到第一項(xiàng),把新牌放到手中最前面
if(j===0){
handle.unshift(A)
}
}
}
return handle
}
// 快速排序
function quick(ary){
// 結(jié)束遞歸(當(dāng)ary中小于等于一項(xiàng)帜篇,則不用處理)
if(ary.length <= 1){
return ary
}
// 找到數(shù)組的中間項(xiàng)徐绑,在原有的數(shù)組中把它移除
let middleIndex = Math.floor(ary.length / 2)
let middleValue = ary.splice(middleIndex,1)[0]
// 準(zhǔn)備左右兩個數(shù)組,循環(huán)剩下數(shù)組中的每一項(xiàng)忌穿,比當(dāng)前項(xiàng)小的放到左邊數(shù)組中抒寂,反之放到右邊數(shù)組中
let aryLefy = [],
aryRight = []
for(let i = 0;i<ary.length;i++){
let item = ary[i]
item < middleValue ? aryLeft.push(item) : aryRight.push(item)
}
// 遞歸方式讓左右兩邊的數(shù)組持續(xù)這樣處理,一直到左右兩邊都排好順序?yàn)橹孤咏#詈笞筮呏虚g右邊拼接成最后結(jié)果
return quick(aryLeft).concat(middleValue,quick(aryRight))
}
- 數(shù)組扁平化的N種實(shí)現(xiàn)方案
let arr = [
[1,2,2],
[3,4,5,5],
[6,7,8,9,[11,12,[12,13,[14]]]],10
]
// es6 無線層級扁平化
arr = arr.flat(Infinity)
// toString再轉(zhuǎn)數(shù)組
arr = arr.toString().split(',').map(item=>paseFloat(item))
// 循環(huán)驗(yàn)證是否為數(shù)組
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr)
}
- 阿里面試題之斐波那契數(shù)列
// 方式1
function fibonacci(n){
if(n <= 1) return 1
let arr = [1,1]
// 即將要創(chuàng)建多少個
let i = n + 1 - 2
while(i > 0){
let a = arr[arr.length - 2],
b = arr[arr.length - 1]
arr.push(a + b)
i--
}
return arr[arr.length - 1]
}
// 方式2
function fibonacci(count){
function fn(count,curr = 1, next = 1){
if(count == 0){
return curr
}else{
return fn(count - 1,next,curr + next)
}
}
return fn(count)
}
- 字節(jié)跳動經(jīng)典算法題
/*
* 輸入一個正數(shù)N屈芜,輸出所有和為N的連續(xù)正數(shù)序列
* 例如: 輸入15
* 結(jié)果: [[1,2,3,4,5],[4,5,6],[7,8]]
*/
function createArr(n,len){
let arr = new Array(len).fill(null),
temp=[]
arr[0] = n
arr = arr.map((item,index) => {
if(item===null){
item = temp[index - 1] + 1
}
temp.push(item)
return item
})
return arr
}
function fn(count){
let result = []
// 求出中間值
let middle = Math.ceil(count / 2)
// 從1開始累加
for(let i = 1;i <= middle;i++){
// 控制累加多少次
for(let j = 2;;j++){
// 求出累加多次的和
let total = (i + (i + j - 1)) * (j / 2)
if(total > count){
break
}else if(total === count){
result.push(createArr(i,j))
break
}
}
}
return result
}