这里应该会长期记录,主要记录自己刷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
};