算法(21)-leetcode-剑指offer5
leetcode-劍指offer-4
- 43.面試題43-1~n整數(shù)中1出現(xiàn)的次數(shù)
- 44.面試題44-數(shù)字序列中某一位的數(shù)字
- 45.面試題45-把數(shù)組排成最小的數(shù)-快排變種
- 46.面試題46-把數(shù)字翻譯成字符串
- 47.面試題47-禮物的最大價值-dp
- 48.面試題48-最長不含重復字符的子字符串-滑動窗口法
- 49.面試題49-丑數(shù)-自底向上遞歸
- 50.面試題50-第一個只出現(xiàn)一次的字符-hash表
- 51.面試題52-兩個鏈表的第一個公共節(jié)點-雙指針技巧
- 52.面試題53-在排序數(shù)組中找數(shù)字
- 54.面試題53-2-0~n-1中的缺失數(shù)字--二分
本系列博文為題庫刷題筆記,(僅在督促自己刷題)如有不詳之處,請參考leetcode官網(wǎng):https://leetcode-cn.com/problemset/lcof/
194/1645
43.面試題43-1~n整數(shù)中1出現(xiàn)的次數(shù)
輸入一個整數(shù) n ,求1~n這n個整數(shù)的十進制表示中1出現(xiàn)的次數(shù)。
例如,輸入12,1~12這些整數(shù)中包含1 的數(shù)字有1、10、11和12,1一共出現(xiàn)了5次。
完全參考:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/
分請情況討論某一位中1出現(xiàn)次數(shù)的計算方法。
44.面試題44-數(shù)字序列中某一位的數(shù)字
數(shù)字以0123456789101112131415…的格式序列化到一個字符序列中。在這個序列中,第5位(從下標0開始計數(shù))是5,第13位是1,第19位是4,等等。
請寫一個函數(shù),求任意第n位對應的數(shù)字。
思路:尋找n 與對應數(shù)字的關系,應該有對應的公式規(guī)律。
數(shù)字:num=123
數(shù)字中一位數(shù)的數(shù)量:n=3
一個數(shù)字的位數(shù):digit,123為3位數(shù),dight=3
digit 位數(shù)的起始數(shù)字:1,10,100,記為start
數(shù)字范圍start?endstart-endstart?end以上三個量的遞推公式為:
digit=digit+1
start=start10
count=9start*dight
求解可以分為三步:
1.確定n所在的數(shù)字的位數(shù),記為digit
2.確定n所在的數(shù)字,記為num
3.確定n是num中的哪一位,并返回結果
45.面試題45-把數(shù)組排成最小的數(shù)-快排變種
輸入一個正整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個數(shù),打印能拼接出的所有數(shù)字中最小的一個。
問題:能拼接的數(shù)字很多么?找最小的一個
[10,2] 可以拼接成102,210,明顯102最小
本質(zhì)是一個排序問題:排序的目的是使得量級最小的數(shù)字排在最前面,使得最后按順序拼接的時候,拼接的數(shù)字最小.
10,5兩個數(shù)字誰在前?按位數(shù)來比較,如果放了5,組成的3位數(shù)以5開頭,所以不能放5,所以應該先放10
總之就是按位排序,誰小誰先放(數(shù)字左對齊比較,看看誰小,先比的數(shù)字對比較結果起決定性作用)
比如30和3,30的量級比3小,30應該在3前面。將數(shù)字轉換成字符串,拼接后比較:(“30”+“3”=“303”)<(“3”+“30”)=>“30”<“3”
改造快排排序規(guī)則:
class Solution(object):def minNumber(self, nums):""":type nums: List[int]:rtype: str"""def quick_sort_str(l,r,data):if l<r:p=patition(l,r,data)quick_sort_str(l,p-1,data)quick_sort_str(p+1,r,data)def patition(i,j,data):pivort=data[i]while(i<j):while(i<j and data[j]+pivort>pivort+data[j]): # 比較規(guī)則需要修改j-=1data[i]=data[j]while(i<j and data[i]+pivort<=pivort+data[i]):i+=1data[j]=data[i]data[i]=pivortreturn inums_str=[]for val in nums:nums_str.append(str(val))quick_sort_str(0,len(nums_str)-1,nums_str)res=""for char in nums_str:res+=charreturn res46.面試題46-把數(shù)字翻譯成字符串
給定一個數(shù)字,我們按照如下規(guī)則把它翻譯為字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l(fā)”,……,25 翻譯成 “z”。一個數(shù)字可能有多個翻譯。請編程實現(xiàn)一個函數(shù),用來計算一個數(shù)字有多少種不同的翻譯方法。
dp[i] 表示nums[0]-nums[i-1] 能夠翻譯成的數(shù)字總數(shù)
dp 由前面的狀態(tài)推導后面的狀態(tài)。
這題有點類似與爬樓梯
47.面試題47-禮物的最大價值-dp
在一個 m*n 的棋盤的每一格都放有一個禮物,每個禮物都有一定的價值(價值大于 0)。你可以從棋盤的左上角開始拿格子里的禮物,并每次向右或者向下移動一格、直到到達棋盤的右下角。給定一個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物?
遞歸所有的路徑,時間超出限制(20/61)。最值問題,應該有最有子結構。
class Solution(object):def __init__(self):self.res=0def maxValue(self, grid):""":type grid: List[List[int]]:rtype: int"""m=len(grid)n=len(grid[0])def dfs(i,j,val):if i>=m or j>=n:return val+=grid[i][j]if i==m-1 and j==n-1:self.res=max(self.res,val)return # 要不要return 呢dfs(i+1,j,val)dfs(i,j+1,val)dfs(0,0,0)return self.res動態(tài)規(guī)劃解題:dp[i][j]到單元格(i,j) 的最大價值。
48.面試題48-最長不含重復字符的子字符串-滑動窗口法
請從字符串中找出一個最長的不包含重復字符的子字符串,計算該最長子字符串的長度。
滑動窗口法:[l,r] 中有一個hash表,統(tǒng)計每個字符的個數(shù),當存在時,窗口變小,直至個數(shù)減為1.
再移動右端。
49.面試題49-丑數(shù)-自底向上遞歸
我們把只包含質(zhì)因子 2、3 和 5 的數(shù)稱作丑數(shù)(Ugly Number)。求按從小到大的順序的第 n 個丑數(shù)。(質(zhì)因子:因子是質(zhì)數(shù))
說明:
1 是丑數(shù)。
n 不超過1690。
思路:丑數(shù)的遞歸性質(zhì),丑數(shù)只包含質(zhì)因子2,3,5,因此 丑數(shù)=某較小的丑數(shù)*某因子
暴力解法:時間超出限制404/595
動態(tài)規(guī)劃: 設動態(tài)規(guī)劃列表 dp ,dp[i]代表第 i + 1個丑數(shù)。
利用狀態(tài)更新求解dp[n-1] 即可。
用a,b,c 三個索引指向num[a]*2,nums[b]*3,nums[c]*5第一次超過dp[i-1]索引,dp[i] 就更新為最小的那個數(shù)。將a,b,c初始化為0,0,0,依次填充dp 序列
50.面試題50-第一個只出現(xiàn)一次的字符-hash表
在字符串 s 中找出第一個只出現(xiàn)一次的字符。如果沒有,返回一個單空格。 s 只包含小寫字母。
class Solution(object):def firstUniqChar(self, s):""":type s: str:rtype: str"""win_hash={}for char in s:if win_hash.get(char)==None:win_hash[char]=1else:win_hash[char]+=1for char in s: # 重新遍歷一遍,使得返回的字符是最左邊第一個出現(xiàn)的字符串if win_hash.get(char)==1:return charreturn " "51.面試題52-兩個鏈表的第一個公共節(jié)點-雙指針技巧
輸入兩個鏈表,找出它們的第一個公共節(jié)點。
雙指針技巧
注意點:先判斷兩個鏈表是否相交,如果相交,在尋找交點
52.面試題53-在排序數(shù)組中找數(shù)字
統(tǒng)計一個數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)。
暴力求解:通過了!!
大佬說還可以用二分法做。
54.面試題53-2-0~n-1中的缺失數(shù)字–二分
一個長度為n-1的遞增排序數(shù)組中的所有數(shù)字都是唯一的,并且每個數(shù)字都在范圍0~n-1之內(nèi)。在范圍0~n-1內(nèi)的n個數(shù)字中有且只有一個數(shù)字不在該數(shù)組中,請找出這個數(shù)字。
[0,1,3],n=4,l=4-1=3,數(shù)字范圍[0,3] 一共n 中情況.
缺失數(shù)字的左邊:nums[i]==i
缺失數(shù)字的位置上:nums[i]!=i
暴力:
二分查找:
class Solution(object):def missingNumber(self, nums):""":type nums: List[int]:rtype: int"""l=len(nums)i,j=0,l-1while(i<=j): # 搜索到i>j的那個點就缺失點mid=(i+j)//2if nums[mid]==mid:i=mid+1 # 左邊沒有缺失else:j=mid-1 # 缺失已經(jīng)發(fā)生,在左半段return i總結
以上是生活随笔為你收集整理的算法(21)-leetcode-剑指offer5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode - Easy - 15
- 下一篇: 算法(7)-leetcode-explo