日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode复习1

發(fā)布時(shí)間:2024/10/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode复习1 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在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解法
class Solution {public int[] twoSum(int[] nums, int target) {/*使用hashmap*/int[] res = new int[2];Map<Integer,Integer> map = new HashMap<Integer,Integer>();for(int i = 0 ; i<nums.length;i++){int othernums = target - nums[i];if (map.get(othernums) != null){res[0] = map.get(othernums);res[1] = i;}map.put(nums[i],i);}return res;} }
  • 兩次遍歷hashmap
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<Integer, Integer>();for(int i = 0; i<nums.length;i++){map.put(nums[i],i);}for (int i = 0; i<nums.length;i++){int othernum = target - nums[i];if(map.containsKey(othernum) && map.get(othernum) != i){return new int[] {i,map.get(othernum)};}} return null;} }

給出兩個(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 = 807

py常規(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.next

Java

和上面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 maxLength

Java解法

將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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。