leetcode-day22-较大分组的位置[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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章