算法(21)-leetcode-劍指offer5

leetcode-劍指offer-4

  • 43.面試題43-1~n整數中1出現的次數
  • 44.面試題44-數字序列中某一位的數字
  • 45.面試題45-把數組排成最小的數-快排變種
  • 46.面試題46-把數字翻譯成字符串
  • 47.面試題47-禮物的最大價值-dp
  • 48.面試題48-最長不含重復字符的子字符串-滑動窗口法
  • 49.面試題49-丑數-自底向上遞歸
  • 50.面試題50-第一個只出現一次的字符-hash表
  • 51.面試題52-兩個鏈表的第一個公共節點-雙指針技巧
  • 52.面試題53-在排序數組中找數字
  • 54.面試題53-2-0~n-1中的缺失數字--二分

本系列博文為題庫刷題筆記,(僅在督促自己刷題)如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/problemset/lcof/
194/1645

43.面試題43-1~n整數中1出現的次數

輸入一個整數 n ,求1~n這n個整數的十進制表示中1出現的次數。
例如,輸入12,1~12這些整數中包含1 的數字有1、10、11和12,1一共出現了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出現次數的計算方法。

class Solution(object):def countDigitOne(self, n):""":type n: int:rtype: int"""digit,res=1,0high,cur,low=n//10,n%10,0while(high!=0 or cur!=0):if cur==0:res+=high*digitelif cur==1:res+=high*digit+low+1else:res+=(high+1)*digitlow+=cur*digitcur=high%10high=high//10digit*=10return res

44.面試題44-數字序列中某一位的數字

數字以0123456789101112131415…的格式序列化到一個字符序列中。在這個序列中,第5位(從下標0開始計數)是5,第13位是1,第19位是4,等等。
請寫一個函數,求任意第n位對應的數字。
思路:尋找n 與對應數字的關系,應該有對應的公式規律。
數字:num=123
數字中一位數的數量:n=3
一個數字的位數:digit,123為3位數,dight=3
digit 位數的起始數字:1,10,100,記為start

數字范圍start?endstart-endstart?end以上三個量的遞推公式為:
digit=digit+1
start=start10
count=9
start*dight

求解可以分為三步:
1.確定n所在的數字的位數,記為digit
2.確定n所在的數字,記為num
3.確定n是num中的哪一位,并返回結果

class Solution(object):def findNthDigit(self, n):""":type n: int:rtype: int"""digit,start,count=1,1,9# 1.計算n所在的位數區間[1-9]是一位數一共9個,[10,99]兩位數一共90個while(n>count):n-=countstart*=10digit+=1count=9*start*digit# 計算在該開始區間內所對應的數字num=start+(n-1)//digit# 確定是數字的哪一位index=(n-1)%digitreturn int(str(num)[index])

45.面試題45-把數組排成最小的數-快排變種

輸入一個正整數數組,把數組里所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。
問題:能拼接的數字很多么?找最小的一個

[10,2] 可以拼接成102,210,明顯102最小

本質是一個排序問題:排序的目的是使得量級最小的數字排在最前面,使得最后按順序拼接的時候,拼接的數字最小.

10,5兩個數字誰在前?按位數來比較,如果放了5,組成的3位數以5開頭,所以不能放5,所以應該先放10
總之就是按位排序,誰小誰先放(數字左對齊比較,看看誰小,先比的數字對比較結果起決定性作用)

比如30和3,30的量級比3小,30應該在3前面。將數字轉換成字符串,拼接后比較:(“30”+“3”=“303”)<(“3”+“30”)=>“30”<“3”

改造快排排序規則:

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]): # 比較規則需要修改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 res

46.面試題46-把數字翻譯成字符串

給定一個數字,我們按照如下規則把它翻譯為字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。
dp[i] 表示nums[0]-nums[i-1] 能夠翻譯成的數字總數
dp 由前面的狀態推導后面的狀態。
在這里插入圖片描述
這題有點類似與爬樓梯

class Solution(object):def translateNum(self, num):""":type num: int:rtype: int"""num_lis=[]while(num):num_lis.append(num%10)num//=10num_lis.reverse()n=len(num_lis)if n<2:return 1dp=[0]*(n+1)dp[0]=1dp[1]=1for i in range(2,n+1):val=10*num_lis[i-2]+ num_lis[i-1]    # 此位置和下一位置構成的數字[0,9],[10,15],[25,99]if 0<=val<10 or 26<=val<=99:     # 09,26,  nums[i]自己翻譯,只有一種翻譯方式dp[i]=dp[i-1]if 10<=val <26:                  # num=12, 2自己單獨翻譯,12一起翻譯, dp[i]=dp[i-1]+dp[i-2]return dp[-1]

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

動態規劃解題:dp[i][j]到單元格(i,j) 的最大價值。

48.面試題48-最長不含重復字符的子字符串-滑動窗口法

請從字符串中找出一個最長的不包含重復字符的子字符串,計算該最長子字符串的長度。
滑動窗口法:[l,r] 中有一個hash表,統計每個字符的個數,當存在時,窗口變小,直至個數減為1.
再移動右端。

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""win={}left,right=0,0res=0m=len(s)while(right<m):c1=s[right]if win.get(c1)==None:win[c1]=1else:win[c1]+=1right+=1while(win[c1]>1):c2=s[left]win[c2]-=1left+=1res=max(res,right-left) # 上面right+ 了1,所以直接減去return res

49.面試題49-丑數-自底向上遞歸

我們把只包含質因子 2、3 和 5 的數稱作丑數(Ugly Number)。求按從小到大的順序的第 n 個丑數。(質因子:因子是質數)
說明:
1 是丑數。
n 不超過1690。
思路:丑數的遞歸性質,丑數只包含質因子2,3,5,因此 丑數=某較小的丑數*某因子
暴力解法:時間超出限制404/595

class Solution(object):def nthUglyNumber(self, n):""":type n: int:rtype: int"""i=1num=1isun_hash={1:True,2:True,3:True,5:True}def is_UN(num):for val in [2,3,5]:if num%val==0 and isun_hash.get(num//val):return Truereturn Falsewhile(i<n):num+=1if is_UN(num) :isun_hash[num]=Truei+=1# print(i,num)return num

動態規劃: 設動態規劃列表 dp ,dp[i]代表第 i + 1個丑數。
利用狀態更新求解dp[n-1] 即可。
用a,b,c 三個索引指向num[a]*2,nums[b]*3,nums[c]*5第一次超過dp[i-1]索引,dp[i] 就更新為最小的那個數。將a,b,c初始化為0,0,0,依次填充dp 序列

class Solution(object):def nthUglyNumber(self, n):""":type n: int:rtype: int"""dp=[1]*na,b,c=0,0,0for i in range(1,n):n2,n3,n5=dp[a]*2,dp[b]*3,dp[c]*5   dp[i]=min(n2,n3,n5)if dp[i]==n2:  # 只能用if ,n2,n3,n5可能會相等,這時需要同時更新下標a+=1if dp[i]==n3:b+=1if dp[i]==n5:c+=1return dp[-1]

50.面試題50-第一個只出現一次的字符-hash表

在字符串 s 中找出第一個只出現一次的字符。如果沒有,返回一個單空格。 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: # 重新遍歷一遍,使得返回的字符是最左邊第一個出現的字符串if win_hash.get(char)==1:return charreturn " "

51.面試題52-兩個鏈表的第一個公共節點-雙指針技巧

輸入兩個鏈表,找出它們的第一個公共節點。
雙指針技巧
注意點:先判斷兩個鏈表是否相交,如果相交,在尋找交點

class Solution(object):def getIntersectionNode(self, headA, headB):""":type head1, head1: ListNode:rtype: ListNode"""if headA==None or headB==None:return Nonepa,pb=headA,headBwhile(pa.next):pa=pa.nextwhile(pb.next):pb=pb.nextif pa!=pb:return Noneelse:pa,pb=headA,headBwhile(pa!=pb):if pa.next:pa=pa.nextelse:pa=headBif pb.next:pb=pb.nextelse:pb=headAreturn  pa

52.面試題53-在排序數組中找數字

統計一個數字在排序數組中出現的次數。
暴力求解:通過了!!

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""res=0for num in nums:if num==target:res+=1return res

大佬說還可以用二分法做。

54.面試題53-2-0~n-1中的缺失數字–二分

一個長度為n-1的遞增排序數組中的所有數字都是唯一的,并且每個數字都在范圍0~n-1之內。在范圍0~n-1內的n個數字中有且只有一個數字不在該數組中,請找出這個數字。
[0,1,3],n=4,l=4-1=3,數字范圍[0,3] 一共n 中情況.
缺失數字的左邊:nums[i]==i
缺失數字的位置上:nums[i]!=i
暴力:

class Solution(object):def missingNumber(self, nums):""":type nums: List[int]:rtype: int"""l=len(nums)for i in range(l):if nums[i]!=i:return ireturn l

二分查找:

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   # 缺失已經發生,在左半段return i

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444858.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲中DDA算法和Bresenham算法的應用

在角色扮演或即時戰略游戲中,經常會將角色以最佳的方式走到指定地點。游戲場景的地面情況復雜,而且場面大,若采用盲目式搜索,例如盲目窮舉法,則幾乎要遍歷整個場景,效率非常低,造成角色反應速度過慢,實踐證明是一種不適合網絡游戲尋路方法。而啟發式搜索算法在障礙較少的情況下…

leetcode7 整數反轉

給出一個 32 位的有符號整數&#xff0c;你需要將這個整數中每位上的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21 注意: 假設我們的環境只能存儲得下 32 位的有符號整數&#xff0c;則其數值范圍為 [?231, …

關于蘋果purchase的驗證

用戶在購買蘋果的商品的過程如下:

算法(23)-leetcode-劍指offer7

leetcode-劍指offer-559.面試題59-隊列的最大值60.面試題64-求12...n61.面試題65-不用加減乘除做加法62.面試題66-構建乘積數組63.面試題68-1二叉樹搜索樹的最近公共祖先64.面試題68-2二叉樹的最近公共祖先65.面試題67-把字符串轉換成數字-自動機66.面試題20-表示數值的字符串-…

C/C++ 獲得公網ip地址和內網ip

獲得公網ip:bool getPublicIp(string& ip) {int sock;char **pptr = NULL;struct sockaddr_in destAddr;struct hostent *ptr = NULL;char destIP[128];sock = socket(AF_INET,SOCK_STREAM,0);if( -1 == sock ){perror("creat socket failed");return …

終于,我讀懂了所有Java集合——List篇

ArrayList 基于數組實現&#xff0c;無容量的限制。 在執行插入元素時可能要擴容&#xff0c;在刪除元素時并不會減小數組的容量&#xff0c;在查找元素時要遍歷數組&#xff0c;對于非null的元素采取equals的方式尋找。 是非線程安全的。 注意點&#xff1a; &#xff08…

關于長連接和短連接

短連接 連接->傳輸數據->關閉連接 HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。 也可以這樣說:短連接是指SOCKET連接后發送后接收完數據后馬上斷開連接。

C++(8)--數組array-長度固定

數組及常用算法1.數組基本概念2.一維數組2.1數組的定義2.2數組初始化2.3一維數組動態賦初值2.4一維數組應用實例2.5一維數組的排序算法2.6 一維數組元素的刪除和插入array3.二維數組3.1數組定義3.2二維數組的動態賦值《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》…

關于去蘋果服務器驗證充值的一些看法

前端時間看了下關于app充值驗證發送游戲金幣的好多帖子和文章,也總結了一下app校驗的php代碼:可以參考我的上一封博客: http://blog.csdn.net/pbymw8iwm/article/details/42167125 其中這個帖子回復的大神比較多:點擊打開鏈接 有些人認為拿蘋果的receptdata去驗證,通過返…

終于,我讀懂了所有Java集合——queue篇

Stack 基于Vector實現&#xff0c;支持LIFO。 類聲明 public class Stack<E> extends Vector<E> {} push public E push(E item) {addElement(item);return item; } pop public synchronized E pop() {E obj;int len size();obj peek();removeElementAt(…

IAP-應用內購買流程

成為ios開發者最大的好處就是&#xff0c;你編寫的應用程序會有很多方式可以賺錢。比如&#xff0c;收費版&#xff0c;免費掛廣告版&#xff0c;還有就是程序內置購買。 程序內置購買會讓你愛不釋手&#xff0c;主要有以下原因&#xff1a; 除了程序本身的下載收費以外&#x…

C++(8.5)--Vector容器

向量容器Vector1. 定義/初始化2. 遍歷3. 常用操作vector 迭代器遍歷&#xff0c;sort, reverse,1. 定義/初始化 vector是同一類型對象的集合&#xff0c;被稱作容器。vector實際是一個類模版&#xff0c;可用于保存多種數據類型的數據&#xff08;確定類型的vector 就只能裝同…

關于mysql的change和modify

前端時間要寫個游戲里的郵件系統&#xff0c;定義了一個如下的表結構&#xff1a; CREATE TABLE sysmail (mailid int(20) NOT NULL AUTO_INCREMENT,sendtime int(11) NOT NULL DEFAULT 0,mailtitle varchar(512) COLLATE utf8_bin NOT NULL DEFAULT ,mailcontext varchar(2048…

終于,我讀懂了所有Java集合——map篇

首先&#xff0c;紅黑樹細節暫時擼不出來&#xff0c;所以沒寫&#xff0c;承諾年前一定寫 HashMap &#xff08;底層是數組鏈表/紅黑樹&#xff0c;無序鍵值對集合&#xff0c;非線程安全&#xff09; 基于哈希表實現&#xff0c;鏈地址法。 loadFactor默認為0.75&#xff0…

valgrind工具使用詳解

zz自 http://blog.csdn.net/destina/article/details/6198443 感謝作者的分享&#xff01; 一 valgrind是什么&#xff1f; Valgrind是一套Linux下&#xff0c;開放源代碼&#xff08;GPL V2&#xff09;的仿真調試工具的集合。Valgrind由內核&#xff08;core&#xff09;以…

C++(9)--裸指針、智能指針、引用

指針1.裸指針的基本概念1.1 裸指針的聲明*/初始化&1.2 操作裸指針--間接運算符*1.3 裸指針使用 demo--指向一個簡單變量1.4 空指針--nullptr1.5 特殊指針--void *ptr2.指針和引用--引用定義&3.指針和數組3.1 數組指針的定義3.2 數組指針遞增/遞減操作3.3 指針與數組使用…

關于valgrind的安裝和內存泄露分析

程序的安裝 如果使用的是tar包安裝. valgrind # wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2 # tar -jxvf valgrind-3.9.0.tar.bz2 # cd valgrind-3.9.0 # ./autogen.sh # ./configure # make; make install 使用命令: valgrind --tool=memcheck --leak-…

關于mysql的cpu占用高的問題

現在游戲開了泰服 ,發現泰服的cpu占用率總是比繁體或者大陸的高很多,每次都是占用了300%多 top - 15:34:06 up 222 days, 2:51, 2 users, load average: 0.75, 0.73, 0.66 Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie Cpu(s): 52.4%us, 8.5%…

網絡原理知識點匯總

OSI七層模型 vs. TCP/IP 五層模型&#xff08;有時候也說四層&#xff09;及各層協議 七層&#xff1a;物理層&#xff1a;為數據端設備提供傳送數據的通路&#xff0c; IEEE802 數據鏈路層&#xff1a;提供介質訪問和鏈路管理&#xff0c; ARP&#xff0c;MTU 網絡層&#xf…

無限踩坑系列(8)--猿界神猿

計算機一句話冷知識1.GNU2. Unix與C語言3. Linux與git-hub4. c/c 編譯器5. python1.GNU GNU是一個自由的操作系統&#xff0c;其內容軟件完全以GPL方式發布。 GNU&#xff1a;GNU’s Not Unix!的遞歸縮寫 Unix 商業化之后&#xff0c; RMS發起了GNU計劃&#xff0c;在該計劃下…