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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装

發布時間:2024/1/8 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

11.9 至 11.17 四道典型題記錄: Counter 彈出 | map函數 | 子集求取 | 有序字符桶分裝

?? 昨天休息的時候一直在想應該學習哪種語言,我想這也是好多人發愁無法下手的原因之一,今年找工作的時候發現更多的研究崗位需要的是 C 語言 或 C++ 語言,而對于一些大型互聯網企業則更喜歡 Java 語言,對于我而言,我更想做一些深度學習相關的工作,單純地覺著這個行業有意思,能夠支持我更長久的學習下去,雖然 搞電路和硬件設備的走得更穩定長久,不過對于我而言,我更相信學習新的、有趣的、更能激發自我動力的學科,其實沒有那么多好猶豫的,想做什么就趕緊去做,不要想那么多,擔憂焦慮最咩意思了!我現在就想學 py3 那就好好學,算法、計組、網絡、操作系統 都會跟上腳步系統學習一下。不想了,學起來。
??本節主要是 關于py3的幾個函數的使用以及個人認為非常不錯的幾道題的記錄,一定要總結一下,就當復習了。
? 部分代碼借鑒他人,提前說一聲,這并不都是我自己碼出來的。~~

791. 自定義字符串排序 (Counter 彈出)

題目鏈接:791. 自定義字符串排序
題目大意:給定兩個字符串 order 和 s 。order 的所有字母都是 唯一 的,并且以前按照一些自定義的順序排序。
對 s 的字符進行置換,使其與排序的 order 相匹配。更具體地說,如果在 order 中的字符 x 出現字符 y 之前,那么在排列后的字符串中, x 也應該出現在 y 之前。
返回 滿足這個性質的 s 的任意一種排列 。

例如:

輸入: order = "cba", s = "abcd" 輸出: "cbad" 解釋: “a”、“b”、“c”是按順序出現的,所以“a”、“b”、“c”的順序應該是“c”、“b”、“a”。 因為“d”不是按順序出現的,所以它可以在返回的字符串中的任何位置?!癲cba”、“cdba”、“cbda”也是有效的輸出。輸入: order = "cbafg", s = "abcd" 輸出: "cbad"
  • 解題思路:與 6230. 長度為 K 子數組中的最大和 的使用思路一樣,需要靈活地將存儲的數組進行存在元素的判斷。
  • 時間復雜度: O ( M + N ) O(M+N) O(M+N) ,其中 M 和 N 分別是字符串 order 和 s 的長度。
  • 空間復雜度: O ( M ) O(M) O(M)
class Solution:def customSortString(self, order: str, s: str) -> str:cnt = collections.Counter(s)ans = ""for ch in order:if ch in s:ans += ch *cnt[ch]cnt.pop(ch)tmp = ""for ch in s:if ch not in ans:tmp += ch# print(ans,tmp)return ans+tmp

?

764. 最大加號標志 map函數(靈活運用 dmap函數)

題目鏈接:764. 最大加號標志 map函數
題目大意:
在一個 n x n 的矩陣 grid 中,除了在數組 mines 中給出的元素為 0,其他每個元素都為 1。mines[i] = [xi, yi]表示 grid[xi][yi] == 0

返回 grid 中包含 1 的最大的 軸對齊 加號標志的階數 。如果未找到加號標志,則返回 0 。

一個 k 階由 1 組成的 “軸對稱”加號標志 具有中心網格 grid[r][c] == 1 ,以及4個從中心向上、向下、向左、向右延伸,長度為 k-1,由 1 組成的臂。注意,只有加號標志的所有網格要求為 1 ,別的網格可能為 0 也可能為 1 。

例如:

輸入: n = 5, mines = [[4, 2]] 輸出: 2 解釋: 在上面的網格中,最大加號標志的階只能是2。一個標志已在圖中標出。輸入: n = 1, mines = [[0, 0]] 輸出: 0 解釋: 沒有加號標志,返回 0
  • 解題思路:遍歷 題目,使用動態數組繼續每個點的數據記錄,進行四次for循環記錄滿足要求的1的最小個數。需要自左向右,自右向左、自上而下以及自下而上的四次遍歷,確定最小的 十字。代碼中用到兩次 map,非常地有趣,簡單說一下:
    (1)anned = set(map(tuple,mines)) 將mines的內容轉換為元素 tuple 之后使用set()函數進行去重操作 ,map 在這里可以充當數據類型轉換的作用;
    (2) max(map(max,dp)) map()的存在讓此語句更容易梳理一些,其實可以寫成max([max(dp[i,:]) for i in range(len(dp))]) 。
  • 時間復雜度: O ( N 2 ) O(N^2) O(N2) ,N為矩陣的行數或列數
  • 空間復雜度: O ( N 2 ) O(N^2) O(N2)
class Solution:def orderOfLargestPlusSign(self, n: int, mines: List[List[int]]) -> int:# map 函數 非常值得學習!!!dp = [[n]*n for _ in range(n)]banned = set(map(tuple,mines))# print(banned)for i in range(n):# leftcnt = 0for j in range(n):cnt = 0 if (i,j) in banned else cnt+1dp[i][j] = min(dp[i][j],cnt)# rightcnt = 0for j in range(n-1,-1,-1):cnt = 0 if (i,j) in banned else cnt+1dp[i][j] = min(dp[i][j],cnt)for j in range(n):# upcnt = 0for i in range(n):cnt = 0 if (i,j) in banned else cnt+1dp[i][j] = min(dp[i][j],cnt) # downcnt=0for i in range(n-1,-1,-1):cnt = 0 if (i,j) in banned else cnt+1dp[i][j] = min(dp[i][j],cnt)return max(map(max,dp))

?

805. 數組的均值分割 子集求取(map巧用非常好地一個用法 值得學習!)

題目鏈接:805. 數組的均值分割 子集求取
題目大意:給定你一個整數數組 nums
我們要將 nums 數組中的每個元素移動到 A 數組 或者 B 數組中,
使得 A 數組和 B 數組不為空,并且 average(A) == average(B)
如果可以完成則返回true , 否則返回 false 。
注意:對于數組 arr , average(arr) 是 arr 的所有元素的和除以 arr 長度。

輸入: nums = [1,2,3,4,5,6,7,8] 輸出: true 解釋: 我們可以將數組分割為 [1,4,5,8][2,3,6,7], 他們的平均值都是4.5。輸入: nums = [3,1] 輸出: false
  • 解題思路:位運算獲取子數組和 思路如下:
    • 對于 nums = [1,2], i 從 1到3
    • i = 01 則為 nums[0] = 1
    • i= 10 則為 nums[1] = 2
    • i= 11 則為 nums[0]+nums[1] = 3。
  • 時間復雜度: O ( n × 2 n 2 ) O(n \times 2^{\frac{n}{2}}) O(n×22n?),n為數組長度
  • 空間復雜度: O ( n × 2 n 2 ) O(n \times 2^{\frac{n}{2}}) O(n×22n?)
class Solution:def splitArraySameAverage(self, nums: List[int]) -> bool:# 折半查找法n = len(nums)if n==1: return Falses = sum(nums)for i in range(n):nums[i] = nums[i]*n-s m = n//2# print(1<<m,m<<1)left = set()for i in range(1,1<<m):# i>>j&1 把 i 算術右移 j 位,然后檢測最低位是否為1tot = sum(x for j,x in enumerate(nums[:m]) if i>>j&1)if tot==0: return Trueleft.add(tot)rsum = sum(nums[m:])for i in range(1,1<<(n-m)):tot = sum(x for j,x in enumerate(nums[m:]) if i>>j&1)if tot==0 or (rsum != tot and -tot in left):return Truereturn False

?

792. 匹配子序列的單詞數(有序字符桶分裝)

題目鏈接:792. 匹配子序列的單詞數
題目大意:
給定字符串 s 和字符串數組 words, 返回 words[i] 中是s的子序列的單詞個數 。
字符串的 子序列 是從原始字符串中生成的新字符串,可以從中刪去一些字符(可以是none),而不改變其余字符的相對順序。
例如, “ace” 是 “abcde” 的子序列。

輸入: s = "abcde", words = ["a","bb","acd","ace"] 輸出: 3 解釋: 有三個是 s 的子序列的單詞: "a", "acd", "ace"。輸入: s = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"] 輸出: 2
  • 解題思路:細細品味,這道題 太 tm 棒了,這個 真滴香。
  • 時間復雜度: O ( n + ∑ i = 0 m ? 1 ∣ w i ∣ ) O(n + \sum_{i=0}^{m-1} |w_i|) O(n+i=0m?1?wi?),n和m分別為s和words的長度, O ( w i ) O(w_i) O(wi?)為words[i]的長度。
  • 空間復雜度: O ( m ) O(m) O(m)
class Solution:def numMatchingSubseq(self, s: str, words: List[str]) -> int:d = collections.defaultdict(deque)ans = 0for i,w in enumerate(words):d[w[0]].append((i,0))for ch in s:for _ in range(len(d[ch])):i,j = d[ch].popleft()j += 1if j == len(words[i]):ans += 1else:d[words[i][j]].append((i,j))return ans

總結

?? 努力 奮斗!最近學一下 粵語 背一下 張國榮哥哥的歌曲,感覺 他的歌 好棒好棒,好有力量!像“默默向上游”的”現實欺弄不擔憂,我要與他決斗,挺著胸對抗命運,努力握實我拳頭“、“我愿那苦痛變力量,默默忍淚向上游”,讓我感覺到一種前所未有的力量在里面,和 邁克杰克遜的灑脫率真不一樣,張國榮哥哥有一種不服輸、抗爭、頑強不屈的精神在其中,他要把事情做好、做到極致,他愛自己的事業、愛自己的人生,要全身心地去做、去努力,正如歌曲中的“求能用心”、“求能用功”、“求能做個好鼓手”。我要學習,要繼續努力,“努力不會有極限”,“若遇失敗再重頭”。這算法不好學,那就更用心、更用功,我還就不信有學不會的!

總結

以上是生活随笔為你收集整理的11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。