劍指offer解題思路簡述 41-50

  • 面試題41:數據流中的中位數

方法1:沒有排序的數組,插入1,得到中位數n

方法2:排序的數組,插入n,得到中位數1

方法3:排序的鏈表,同排序的數組

方法4:最大堆+最小堆,插入logn,得到中位數1,保證建立的最大堆的每個數都小於最小堆,爲保證兩個堆平衡,約定當前數目爲奇數時放到最大堆,如果當前數大於最小堆的最小數x,則將x放入最大堆,將當前數放入最小堆。

  • 面試題42:連續子數組的最大和

方法:當前累加的和若爲負數,直接捨棄,保存當前的最大和,從下一個數重新開始累加

  • 面試題43:1~n整數中1出現的次數

方法:有點繞

  • 面試題44:數字序列中某一位的數字

方法:確定是幾位數

  • 面試題45:把數組排成最小的數

方法一:求全排列,然後比較大小

方法二:

sorted(ss, key=functools.cmp_to_key(lambda a,b: int(str(a)+str(b))-int(str(b)+str(a))), reverse=True)
  • 面試題46:把數字翻譯成字符串

方法:從後往前,相當於斐波拉契數列,只不過這裏面多了一個條件,只有當10*s[-1-i]+s[-i]需要在小於25,f(n)=f(n-1)+f(n-2),如果大於的話f(n)=f(n-1)

  • 面試題47:禮物的最大價值

方法:兩層for循環,當第一行或者第一列的時候,只用當前值加上該行或者該列的上一個值就可以,其他的情況需要加上一行和上一列的最大值。優化的方法:在原數組上操作,不需要新建一個空間。

  • 面試題48:最長不含重複字符的子字符串

方法:遍歷字符串,建一個等長的數組保存當前位置的最大字符串數,建一個list保存當前狀態下前面不重複的字符串,每次遍歷都更新,如果新來的字符沒有重複,則直接加一,有重複的話找到在list中的位置,切片獲取它後面的部分,然後更新

  • 面試題49:醜數

方法:思路就是用2,3,5分別乘以找到的醜數,並且整個過程按照大小順序排列。[1,2,3,....]設置三個初始值爲0的數分別標記當前2,3,5乘到了結果list的第幾位,如先比較1*2,1*3,1*5,明顯2小,所以把2 append進list裏,然後把2的標誌位加1,下次2就需要乘2,再和其他比較。

  • 面試題50:第一個只出現一次的字符

方法1:創建一個哈希表,字符作爲key,次數作爲value,字符的種類一共有256個,所以空間複雜度爲1。掃描兩次字符串,第一次記錄每個字符串出現的次數,第二次從前遍歷,找到value值第一次出現爲1的key,時間複雜度爲n

方法2:利用python自帶的函數,for index, value in enumerate(s): if s.count(value) == 1:return 

方法:設置一個字典存放字符和次數,設置一個list存放當前出現過的字符,每次for list,找到第一個value值爲1的key,直接返回

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章