共计 1548 个字符,预计需要花费 4 分钟才能阅读完成。
昨天聊了一个算法题,今天接着聊!多聊几个。
1、拍平数组(多维数组变成一维数组)
let arr = [1,[2,3,[4],[5,6,[7]]],8]//[1,2,3,4,5,6,7,8]
// 这个有很多方法,我们一一说来
// 第一种遍历数组,遍历过程遇到数组递归。
function flatten(arr, newArr) {
// 省去全局变量,还避开了函数嵌套闭包的形成。
newArr = newArr || []
for (let i = 0; i < arr.length; i++) {
// 如果是 arr[i]是数组那么递归执行,并把当前 arr[i]和已有 newArr 传进去继续 push。
// 如果不是直接 push 到 newArr
typeof arr[i] === ‘object’ ? flatten(arr[i], newArr) : newArr.push(arr[i])
}
return newArr
}
console.log(flatten(arr))
// 第二种,逻辑一样只不过遍历换成了 reduce,如果读的比较困难请移步:https://segmentfault.com/a/1190000017510301 了解 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 会默认过滤数组内部[],算是一个奇淫技巧。
return arr.join(‘,’).split(‘,’)
}
console.log(flatten2(arr))
// 第三种稍有点问题,如果数组内是 number 类型会拍平后会变成字符串。
2、写一个方法判断字符串内 () 是否成对出现,是返回 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);
// 如果是右括号且当前 arr 不为空弹出栈顶
} else if (item === ‘)’ && result.length != 0) {
// 弹出栈顶
result.pop()
} else {
// 如果是右括号且当前 result 为空,则直接判定为不合法
return false
}
}
return result ? true : false
}
console.log(isTure(str)) //true
console.log(isTure(str1)) //false
2、用计数方式其实和栈原理类似
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 今天分享就到这,明天继续!