leetcode记录(一)

这里应该会长期记录,主要记录自己刷leetocde的过程,尽量保证遇到的题目自己都会和懂,语言用Java和JavaScript。
从最简单的题目开始,尽量保证都每道题都会,并且一定要分类

数组

1、求两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

解答
通过两个for循环嵌套,第一个是遍历得到for循环的值,第二个比较是否和第一个减去的值相等
比较简单

let twoSum= (nums,target)=> {
    for (let i = 0; i < nums.length; i++) {
            let rest =target-nums[i]
            for (let j = i+1; j < nums.length; j++) {
                if (rest===nums[j]) {
                    return [i, j]
                }
            }
                 
    }
}

链表

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 链表的特点是,通过 **节点**来相互连接,上一个节点的指针指向下一个节点,下一个节点的指针指向下下个节点。双向链表也就是两个指针指向不同的方向

通过链表,让他们全部都指向第一个,接下来每一个相互相加

重点理解:
t通过逆序相加的方式,如果满10则进1,GitHub模拟的是链表,因此每个都有value

let addTwoNumbers = function (l1, l2) {
    const dummy = new ListNode(null)
    let cur = dummy;
    let carry = 0;
    while (l1 || l2) {
        // 判定一下l1和l2值是否存在
        const val1 = l1 ? l1.val : 0
        const val2 = l2 ? l2.val : 0
        let answer = val1 + val2 + carry;
        carry = answer > 9 ? 1 : 0
        cur.next = new ListNode(answer % 10)
        if (l1) l1 = l1.next;
        if (l2) l2 = l2.next;
        cur = cur.next;
    }
    if(carry===1) cur.next = new ListNode(1)
    return dummy.next;

};

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

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。·
哈希表和移动窗口算法(求一段字符串中无重复时经常用到)

每次右边的指针都需要比较有没有重复,如果有,则将左指针移到新的位置,另外通过max方法来更新重复的位置,如果重复的在之前,则提到新的位置。
如果没有,则通过right-left+1(左指针是从0开始,所以左和右指针之间的距离+1才是整个长度)来和之前的长度比较,如果相等,才是结果

let lengthOfLongestSubstring = function (s) {


// 通过hasp表来存放s字符串中每个ASCII码出现的下标位置,一开始先设置为空,即没有ASCII码在
// 每次右窗口移动时,都要比较窗口的长度和检查有没有重复的字符出现,没有就添加到哈希表
// 3 通过右指针表示右窗口,先往有移动,如果当前右窗口的边界指向的字符在哈希表里面,那么说明同一个字符重复出现了,取当
// 前找到该字符的最后一个位置作为新的左窗口的一个边界
let map = new Map(),
left = 0,
 result = 0;
for (let right = 0; right < s.length; right++) {
  if (map.has(s[right])) {
    // 记录当前的左指针,如果右边的数在左指针之前,则依旧取当前的指针
    left = Math.max(map.get(s[right]),left)
  }
//   记录当前记录的时间点,如果记录的没超过,之前的仍然是最大的
  result =Math.max(result,right-left+1);
  map.set(s[right],right+1)
}
console.log(result);
return result
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值