昨天聊了一個算法題,今天接著聊!多聊幾個。
1、拍平數(shù)組(多維數(shù)組變成一維數(shù)組)
let arr = [1,[2,3,[4],[5,6,[7]]],8]//[1,2,3,4,5,6,7,8]
//這個有很多方法,我們一一說來
//第一種遍歷數(shù)組,遍歷過程遇到數(shù)組遞歸。
function flatten(arr, newArr) {
//省去全局變量,還避開了函數(shù)嵌套閉包的形成。
newArr = newArr || []
for (let i = 0; i < arr.length; i++) {
//如果是arr[i]是數(shù)組那么遞歸執(zhí)行,并把當(dāng)前arr[i]和已有newArr傳進去繼續(xù)push。
//如果不是直接push到newArr
typeof arr[i] === 'object' ? flatten(arr[i], newArr) : newArr.push(arr[i])
}
return newArr
}
console.log(flatten(arr))
//第二種,邏輯一樣只不過遍歷換成了reduce,如果讀的比較困難請移步:http://www.itdecent.cn/p/5c562787b495 了解reduce
function flatten1(arr) {
return arr.reduce((newArr, item) => {
return typeof item === 'object' ? newArr.concat(flatten1(item, newArr)) : (newArr.push(item), newArr)
}, [])
}
console.log(flatten1(arr))
//第三種比較簡單
function flatten2(arr) {
//join會默認過濾數(shù)組內(nèi)部[],算是一個奇淫技巧。
return arr.join(',').split(',')
}
console.log(flatten2(arr))
//第三種稍有點問題,如果數(shù)組內(nèi)是number類型會拍平后會變成字符串。
2、寫一個方法判斷字符串內(nèi)()是否成對出現(xiàn),是返回true不是返回false
let str = '(()()())'
let str1 = '(())()())'
//1、先用棧的思路解決
function isTure(str, result = []) {
let arr = str.split('')
for (let i = 0; i < arr.length; i++) {
const item = arr[i];
// 如果是左括號直接壓棧
if (item === '(') {
// 壓棧
result.push(item);
// 如果是右括號且當(dāng)前arr不為空彈出棧頂
} else if (item === ')' && result.length != 0) {
// 彈出棧頂
result.pop()
} else {
//如果是右括號且當(dāng)前result為空,則直接判定為不合法
return false
}
}
return result ? true : false
}
console.log(isTure(str)) //true
console.log(isTure(str1)) //false
2、用計數(shù)方式其實和棧原理類似
function isTure1(str, count = 0) {
let arr = str.split('')
for (let i = 0; i < arr.length; i++) {
const item = arr[i];
if (item === '(') {
count++
} else if (item === ')' && count != 0) {
count--
} else {
return false
}
}
return !count ? true : false
}
console.log(isTure1(str))//true
console.log(isTure1(str1))//false
ok 今天分享就到這,明天繼續(xù)!