学习不易、这里是总结看过的算法题哟、虽然大部分都看不懂、但是还是坚持看一下解题过程。。。力扣
两数之和 题目:给定一个整数数组nums
和一个目标值target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
示例:
1 2 3 4 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
题解:
当然、最暴力的方法就是双重循环遍历来判断、但是性能较低。最开始还是看不懂的、之和看了解题过程才明白的、我是fw。 然而这里是循环遍历数组、target获取另一个数、判断Map中是否有这个数、有就通过数组返回 Map 中对应值的下标 和 当前索引、没有就把当前数组值和索引放入Map中、继续循环。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var twoSum = function (nums, target ) { var tempMap = new Map () for (var i = 0 ; i < nums.length ; i++) { var ontherNum = target - nums[i] if (tempMap.has (ontherNum)) { return [tempMap.get (ontherNum), i] } tempMap.set (nums[i], i) } } console .log (twoSum ([2 , 7 , 11 , 15 ], 9 ))
两数相加 题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
1 2 3 输入: (2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 0 -> 8 原因: 342 + 365 = 807
题解:
我们可以简单化一个链表的模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 var l1 = { val : 2 , next : { val : 4 , next : { val : 3 , next : null } } } var l2 = { val : 5 , next : { val : 6 , next : { val : 4 , next : null } } }
。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 var addTwoNumbers = function (l1, l2 ) { var c1 = l1, c2 = l2, c3, l3, carry = 0 ; while (c1 || c2 || carry) { var v1 = 0 ; var v2 = 0 ; var sum = 0 ; if (c1) { v1 = c1.val ; c1 = c1.next ; } if (c2) { v2 = c2.val ; c2 = c2.next ; } sum = v1 + v2 + carry; carry = Math .floor (sum / 10 ) if (!c3) { l3 = new ListNode (sum % 10 ) c3 = l3 } else { c3.next = new ListNode (sum % 10 ) c3 = c3.next } } return l3 }
无重复字符的最长子串 题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
1 2 3 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
1 2 3 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
1 2 3 4 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解:
力扣解法图: https://pic.leetcode-cn.com/202ea5bd4d4ba4a21afafdf52a9ea2556ba6265c1576840f09ace50aafab095c.png
这道题的思路就是用一个数组arr临时存放s中的字符、循环遍历s是判断当前字符是否存在于arr中、存在就获取下标并删除包括当前下标之前的值、再将当前字符添加进去、最后比较maxLength和arr的长度去最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var lengthOfLongestSubstring = function (s ) { var arr = [] var maxLength = 0 ; for (let item of s) { if (arr.includes (item)) { let index = arr.indexOf (item) arr.splice (0 , index + 1 ) } arr.push (item) maxLength = Math .max (maxLength, arr.length ) } return maxLength } console .log (lengthOfLongestSubstring ("pwwpwe" ));