前端高频题js题解DAY1 | 3. 无重复字符的最长子串 25. K 个一组翻转链表

前端高频题js题解 | 3. 无重复字符的最长子串 25. K 个一组翻转链表

3. 无重复字符的最长子串

题目链接: 3. 无重复字符的最长子串
思路:
1.定义变量:一个set;左右下标i,j;记录最大值的变量max
2.循环加入新字母到set里,如果没有重复,加入并且更新max的值。如果有重复,则一直移动左下标并删除set中的字母,直到没有重复为止。

set知识点:
Set 是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次。
它的主要方法如下:
new Set(iterable) —— 创建一个 set,如果提供了一个 iterable 对象(通常是数组),将会从数组里面复制值到 set 中。
set.add(value) —— 添加一个值,返回 set 本身
set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false。
set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false。
set.clear() —— 清空 set。
set.size —— 返回元素个数。

易错点都在代码注释里了
代码:

var lengthOfLongestSubstring = function (s) {
    let set=new Set();
    let i=0,j=0;
    // if(s.length===0) return 0;
    let max=0;
    for(;j<s.length;j++){
        if(!set.has(s[j])){
            set.add(s[j]);
            max=max>set.size?max:set.size;//每加入一个新元素比较一下
        }
        else{
            // 这里不能这样写,当只有一个元素的时候不会进入这个判断
            // max=max>set.size?max:set.size; 
            while(set.has(s[j])){
            //这里一定要用while是因为有可能是在前面字符串的中间遇到重复的字母
                set.delete(s[i]);
                i++;
            }
            set.add(s[j]);//别忘了加上这个s[j]
        }
    }
    return max;
};

问题与感想:
1.debug用打印变量和手推画图的方法比较快,光空想是想不出来的…遇到问题先看题解,然后不懂得地方不通过的测试案例自己动手画图推一下就懂了。
2.set检查重复还挺好用的。
3.手写的时候好多细节错误,无语了

25. K 个一组翻转链表

题目链接: 25. K 个一组翻转链表
思路:
力扣官方题解

代码:
易错点都在代码注释里了

var reverseKGroup = function (head, k) {
    let hair = new ListNode(0, head);
    let pre = hair;
    if (k === 1 || !head.next) return head;
    while (head) {
        let tail = pre;
        // while (k--) {不能这么写,因为这样会改变k的值...下一次循环会出错
        //     tail = tail.next;
        //     if (!tail) return hair.next;
        // }
        for (let i = 0; i < k; ++i) {
            tail = tail.next;
            if (!tail) {
                return hair.next;
            }
        }
        let nex = tail.next;
        [head, tail] = myReverse(head, tail);
        pre.next = head;
        tail.next = nex;
        pre = tail;
        head = tail.next;
    }
    return hair.next;
};

function myReverse(head, tail) {
    let prev = tail.next;
    let p = head;//必须有这个,否则head会变
    while (prev != tail) {
        let nex = p.next;
        p.next = prev;
        prev = p;
        p = nex;
    }
    return [tail, head];
}

问题与感想:
1.感觉这题要背答案…看了题解还写了一个多小时,呵呵
2.while和for循环注意区别,还是多用for不太容易出错(因为for单独定义了一个循环变量)。while最好在简单判断正误的时候用就行了。

感想总结

1.nmd真难,链表也这么难(暴躁)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值