leetcode复习1
在pycharm和IDEA 裝leetcode插件,刷起來賊爽
登錄leetcode賬號(hào):開搞
要求java 和py方法
之前寫過,很快就不會(huì)了,果然還是要五毒刷題法
五毒刷題法 (極客覃超)
NO.1 leetcode 兩數(shù)之和
題目描述
給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)目標(biāo)值 target,請你在該數(shù)組中找出和為目標(biāo)值的那 兩個(gè) 整數(shù),并返回他們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會(huì)對應(yīng)一個(gè)答案。但是,你不能重復(fù)利用這個(gè)數(shù)組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9 因?yàn)?nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]py代碼解法
列表解法
def twoSum_1( nums, target):result = []for i in range (len(nums)):onenum = nums[i]twonum = target - onenumif twonum in nums:j = nums.index(twonum)if i != j:result.append(i)result.append(j)return result字典解法
def twoSum_2(nums,target):dict={}for i in range(len(nums)):m = nums[i]if target-m in dict:return [dict[target-m],i]dict[m] = i字典推導(dǎo)式
def twosum_3(nums,target):l = len(nums)dict = {nums[i]:i for i in range(l)}print(dict)for j in range(l):a = nums[j]b = target - aif b in dict and j != dict[b]:return [j,dict[b]]Java
- 一遍hashmap解法
- 兩次遍歷hashmap
給出兩個(gè) 非空 的鏈表用來表示兩個(gè)非負(fù)的整數(shù)。其中,它們各自的位數(shù)是按照 逆序 的方式存儲(chǔ)的,并且它們的每個(gè)節(jié)點(diǎn)只能存儲(chǔ) 一位 數(shù)字。
如果,我們將這兩個(gè)數(shù)相加起來,則會(huì)返回一個(gè)新的鏈表來表示它們的和。
您可以假設(shè)除了數(shù)字 0 之外,這兩個(gè)數(shù)都不會(huì)以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807py常規(guī)操作
class Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:# 將鏈表轉(zhuǎn)化列表val1, val2 = [l1.val], [l2.val]while l1.next:val1.append(l1.next.val)l1 = l1.nextwhile l2.next:val2.append(l2.next.val)l2 = l2.next# 反轉(zhuǎn)列表 用join方法拼接數(shù)字 切片[::-1]num_1 = ''.join([str(i) for i in val1[::-1]])num_2 = ''.join([str(i) for i in val2[::-1]])sums = str(num_1 + num_2)[::-1]# 將sum轉(zhuǎn)化成鏈表res# 頭節(jié)點(diǎn)res = head = ListNode(int(sums[0]))for i in range(1, len(sums)):# 拼接head.next = ListNode(int(sums[i]))head = head.nextreturn res優(yōu)化:不需要將整個(gè)數(shù)的和求出,只需要每一位對應(yīng)相加,
思路:
將結(jié)果保存在一個(gè)新的鏈表中,使用兩個(gè)指針,一個(gè)指向頭節(jié)點(diǎn),用于返回結(jié)果,另一個(gè)指向當(dāng)前節(jié)點(diǎn),用于計(jì)算并保存結(jié)果。遍歷兩個(gè)輸入鏈表,逐位進(jìn)行相加,若某一個(gè)鏈表遍歷到了結(jié)尾,則取 0 參與運(yùn)算。每一位的數(shù)字為兩個(gè)數(shù)字對應(yīng)位以及進(jìn)位之和除 10 的余數(shù),而該位是否有進(jìn)位則是這個(gè)和除 10 的商。
class Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:# 判斷0 還是1res = 0root = n = ListNode(0)while l1 or l2 or res:v1 = v2 = 0if l1:v1 = l1.vall1 = l1.nextif l2:v2 = l2.vall2 = l2.next# divmod() 函數(shù)把除數(shù)和余數(shù)運(yùn)算結(jié)果結(jié)合起來,返回一個(gè)包含商和余數(shù)的元組(a // b, a % b)。res, val = divmod(v1 + v2 + res, 10)n.next = ListNode(val)n = n.nextreturn root.nextJava
和上面python相同的思路
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode root = new ListNode(0);ListNode cur = root;int res = 0;// TODO 如果 l1 和l2為空 ,res = 0, pass res = 1 再執(zhí)行一遍while (l1 != null||l2 != null|| res !=0){if (l1 != null) {res += l1.val;l1 = l1.next;}if (l2 != null) {res += l2.val;l2 = l2.next;}cur.next = new ListNode(res%10);res /= 10;cur = cur.next;}return root.next;} }NO3、找出其中不含有重復(fù)字符的 最長子串 的長度。
給定一個(gè)字符串,請你找出其中不含有重復(fù)字符的 最長子串 的長度。
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 “abc”,所以其長度為 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 “b”,所以其長度為 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個(gè)子序列,不是子串。
hashset,哈希表兩種解法
推薦hashmap時(shí)間復(fù)雜度o(n)
py2種解法
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if s == '':return 0#這樣必有一個(gè)res = 1i = 0for j in range(1, len(s)):if s[j] not in s[i:j]:# s[j] 沒有重復(fù)出現(xiàn) res 取 j-i+1res = max(res, j - i + 1 )else:# s[j] 竟然重復(fù)出現(xiàn)了 如'abcaa'# s[i:j].index(s[j]) 指當(dāng)前 i的位置i += s[i:j].index(s[j]) + 1return res使用字典方法
推薦使用字典方法(性能速度高)
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# start子字符串的起始位置# maxlength 輸出最大子序列的長度start = maxLength = 0# 記錄每次遍歷到的字符,key=char,value=indexusedChar = {}for i in range(len(s)):# 如果字符存在于字典中,且位置是在起始位置的右邊,說明遇到了重復(fù)字符if s[i] in usedChar and start <= usedChar[s[i]]:# 將起始位置修改為重復(fù)字符第一次出現(xiàn)的位置的右鄰start = usedChar[s[i]] + 1# 字符不存在于字典中else:# 有可能start跳到重復(fù)字符,所以用max方法maxLength = max(maxLength, i - start + 1)# 更新userdCharusedChar[s[i]] = ireturn maxLengthJava解法
將py代碼改寫成Java
import java.util.HashMap;//leetcode submit region begin(Prohibit modification and deletion) class Solution {public int lengthOfLongestSubstring(String s) {if (s.length() == 0) return 0;int max = 0;HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();for (int i = 0 ,j = 0; i < s.length(); i++) {// j是初始位置 重復(fù)出現(xiàn)字符 // j將起始位置修改為重復(fù)字符第一次出現(xiàn)的位置的右鄰if (hashMap.containsKey(s.charAt(i))) {j = Math.max(j, hashMap.get(s.charAt(i)) + 1);}// 更新hashmaphashMap.put(s.charAt(i), i);max = Math.max(max, i - j + 1);}return max;} } 與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的leetcode复习1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 团体险的弊端
- 下一篇: 利用学习率衰减找到最优结果(基于Iris