昨天聊了一个算法题,今天接着聊!多聊几个。算法
一、拍平数组(多维数组变成一维数组)segmentfault
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类型会拍平后会变成字符串。
二、写一个方法判断字符串内()是否成对出现,是返回true不是返回false数组
let str = '(()()())' let str1 = '(())()())' //一、先用栈的思路解决 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 二、用计数方式其实和栈原理相似 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 今天分享就到这,明天继续!闭包