leetcode-day65-較大分組的位置[830]

之前一直在Leetcode裏面做完未記錄,今天又想起來記錄下,是因爲一道題有時候用了多種方法寫,在leetcode裏面看不方便,既然想起來還是記錄下吧。


解法一: 利用棧的思路
思路: 將s轉成數組,加入棧中,如果加入的字符和棧中最後一個字符相同,則累加,直到累加超過3,則加入結果數組裏,這裏存在一個大於3的時候重複添加的過程,所以最近結果數組再去重。
這樣寫內存消耗比較大!

let stack = [], resArr = [], resArr2 = [];
    let arr = s.split('');
    let i = -1, num = 1;
    while(arr.length > 0){
        i++;
        let item = arr.shift();
        if(stack[stack.length - 1] && stack[stack.length - 1] === item){
            num++;
            if(num>=3){
                resArr[1] = i;
                resArr2.push(resArr);
            }
        }else{
            num = 1;
            resArr = []
            resArr[0] = i;
            stack.push(item);
        }
    }
    return [...new Set(resArr2)];

解法二: 雙指針法
思路:定義前後指針都爲0,當前一個元素和後一個相同的時候,讓後指針先走,直到出現元素和前一個元素不同的時候,統計後指針是否比前指針多走了2步,如果是,則將前後指針步數加入結果數組。同時在不同的時候將前後指針的步數與當前位置i保持統一。

  let start = end = 0;
    let res = [];
    for(let i=0;i<s.length;i++){
        if(s[i] === s[i+1]){
            end++
        }else{
            if(end - start >=2){
                res.push([start, end]);
            }
            start = end = i+1;
        }
    }
    return res;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章