昨天聊了一個算法題,今天接着聊!多聊幾個。算法
一、拍平數組(多維數組變成一維數組)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 今天分享就到這,明天繼續!閉包