春招臨近,不管是要找工做的準畢業生,仍是身在職場想要提高本身的程序員,提高本身的算法內功心法、提高 Python 編程能力,老是大有裨益的。今天,小編髮現了一份好資源:Python 實現的面試題集錦!node
這份資源名爲:Interview-code-practice-python!包含了幾百道算法面試題,並且全都使用 Python 編寫了答案。有問有答,學得豈不快哉~python
好了,話很少說,平臺不能放連接,能夠直接去GitHub上搜,或者找我要也能夠!git
這個項目資源總共包含了 5 個方面的真題,分別是:2017 校招真題、劍指 offer、華爲機試、機試題、直通 BAT 算法題。程序員
接下來,咱們分別來看一下具體內容。面試
1. 2017 校招真題算法
這部分包含了 37 道 2017 年的校招真題。shell
每一個題目都配備相應的 Python 實現。例如咱們來看一個有趣的例子:餐廳.py編程
1 # 在 m 批客人中選擇 n 批上 n 個桌子 2 n, m = [int(x) for x in input().split()] 3 # 每一個桌子可容納的最大人數 4 table = [int(x) for x in input().split()] 5 # 分別表示第 i 批客人的人數和預計消費金額 6 cus = [[int(x) for x in input().split()] for i in range(m)] 7 8 # 將桌子按可容納人數從小到大排列 9 table.sort() 10 # 按每批顧客的人數從小到大排序 11 cus = sorted(cus, key=lambda x: x[0]) 12 # 總金額 13 money = 0 14 15 for i in range(n): 16 # 盛放第 i 個可接受的顧客批 j 17 temp = [] 18 # 注意 range 中要用 cus 的 length 時更新 19 for j in range(len(cus)): 20 if cus[j][0] > table[i]: 21 break 22 temp.append(cus[j]) 23 # 按消費金額排序 24 temp = sorted(temp, key=lambda x: x[1]) 25 if temp: 26 money += temp[-1][1] 27 # 此批客人已就坐 28 cus.remove() 29 print(money)
2. 劍指 offerapp
這部分共包含了 68 道劍指真題。函數
請看示例:變態青蛙跳.py
1 ''' 2 題目:一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法 3 ''' 4 5 ''' 6 由於n級臺階,第一步有n種跳法:跳1級、跳2級、到跳n級 7 跳1級,剩下n-1級,則剩下跳法是f(n-1) 8 跳2級,剩下n-2級,則剩下跳法是f(n-2) 9 因此f(n)=f(n-1)+f(n-2)+...+f(1) 10 由於f(n-1)=f(n-2)+f(n-3)+...+f(1) 11 因此f(n)=2*f(n-1) 12 而後求解這個無窮級數的和,正確答案應該是:每次至少跳一個,至多跳n個,一共有f(n)=2n-1種跳法 13 29ms 14 5632k 15 ''' 16 17 # -*- coding:utf-8 -*- 18 class Solution: 19 def jumpFloorII(self, number): 20 # write code here 21 return 2**(number-1)
3. 華爲機試
這部分包含 41 道華爲機試題。
請看示例:密碼驗證合格程序.py
1 ''' 2 1.長度超過8位 3 2.包括大小寫字母.數字.其它符號,以上四種至少三種 4 3.不能有相同長度超2的子串重複 5 說明:長度超過2的子串 6 ''' 7 8 # import re, sys 9 # 10 # for i in sys.stdin.readlines(): 11 # print("OK" if len(i.strip()) > 8 and sum( 12 # [1 if re.search(r"[A-Z]", i.strip()) else 0, 1 if re.search(r"[a-z]", i.strip()) else 0, 13 # 1 if re.search(r"[0-9]", i.strip()) else 0, 1 if re.search(r"[^0-9a-zA-Z]", i.strip()) else 0]) > 2 and sum( 14 # map(lambda c: i.strip().count(i.strip()[c:c + 3]) > 1, range(1, len(i.strip()) - 3))) == 0 else "NG") 15 16 # 略微思考會發現,只須要判斷長度爲3的子串是否出現便可。由於假設子串長度爲4的出現,則必定包括了長度爲3的子串。同時須要注意, 17 # 本題說的子串指包括了部分子串重疊的狀況, 18 # 例如Qw11111*ed這個是不能經過的。再就是須要注意,判斷子串的時候只須要判斷到len(str)-3就好了。 19 20 import sys 21 22 try: 23 # 大小寫,字母, 24 def panchar(sss): 25 standard = [0] * 4 26 for i in sss: 27 # print(i) 28 # 0 29 # 2 30 # 1 31 # A 32 # b 33 # print(len(sss)) 34 # 數字 35 if i.isdigit(): 36 standard[0] = 1 37 # print(i.isdigit()) 38 # 小寫 39 if i.islower(): 40 standard[1] = 1 41 # 大寫 42 if i.isupper(): 43 standard[2] = 1 44 # 全都是字母,數字,空格 45 if not i.isalpha() and not i.isdigit() and not i.isspace(): 46 standard[3] = 1 47 if sum(standard) >= 3: 48 return False 49 return True 50 51 # 不能有相同長度超 2 的字串重複 52 def zichuan(sss): 53 for i in range(len(sss) - 3): 54 zichuan_1 = sss[i: i + 3] 55 zichuan_2 = sss[i + 1::] 56 if zichuan_1 in zichuan_2: 57 return True 58 return False 59 60 result = [] 61 while True: 62 line = sys.stdin.readline().strip() 63 if line == '': 64 break 65 if len(line) <= 8: 66 result.append('NG') 67 # 大小寫字母.數字.其它符號 68 elif panchar(line): 69 result.append('NG') 70 elif zichuan(line): 71 result.append('NG') 72 else: 73 result.append('OK') 74 for i in result: 75 print(i) 76 except: 77 pass 78 79 80 # # 循環輸入,try catch 81 # while True: 82 # try: 83 # x = input().split() 84 # 85 # 86 # except: 87 # pass
4. 機試題
這部分包含 3 道機試題。
請看示例:排序.py
1 # # 冒泡排序 2 # # 時間複雜度 O(n**2) 空間複雜度 O(1) 3 # x = [int(i) for i in input().split(',')] 4 # 5 # # print(x) 6 # 7 # def mpsort(x): 8 # n = len(x) 9 # # print(n) 10 # for i in range(n - 1): 11 # for j in range(0, n - i - 1): 12 # # print(x[j]) 13 # if x[j] > x[j + 1]: 14 # x[j], x[j + 1] = x[j + 1], x[j] 15 # return x 16 # 17 # print(mpsort(x)) 18 19 # # 選擇排序 20 # # 時間複雜度 O(n**2) 空間複雜度 O(1) 21 # x = [int(i) for i in input().split(',')] 22 # 23 # def xzsort(x): 24 # n = len(x) 25 # for i in range(n - 1): 26 # min = i 27 # for j in range(i + 1, n): 28 # if x[j] < x[min]: 29 # min = j 30 # x[i], x[min] = x[min], x[i] 31 # return x 32 # 33 # print(xzsort(x)) 34 35 # # 插入排序 36 # # 時間複雜度 O(n**2) 空間複雜度 O(1) 37 # x = [int(i) for i in input().split(',')] 38 # 39 # def crsort(x): 40 # n = len(x) 41 # for i in range(1, n): 42 # j = i 43 # while j > 0: 44 # if x[j] < x[j - 1]: 45 # x[j], x[j - 1] = x[j - 1], x[j] 46 # j -= 1 47 # else: 48 # break 49 # return x 50 # 51 # print(crsort(x)) 52 53 # # 希爾排序 54 # # 時間複雜度 O(nlogn)-O(n**2) 空間複雜度 O(1) 55 # x = [int(i) for i in input().split(',')] 56 # 57 # def shellsort(x): 58 # n = len(x) 59 # gap = n // 2 60 # 61 # while gap > 0: 62 # for i in range(gap, n): 63 # j = i 64 # while j > 0: 65 # if x[j] < x[j - gap]: 66 # x[j], x[j - gap] = x[j - gap], x[j] 67 # j -= gap 68 # else: 69 # break 70 # gap //= 2 71 # return x 72 # 73 # print(shellsort(x)) 74 75 # # 快速排序 76 # # 時間複雜度 O(nlogn) 空間複雜度 O(logn)-O(n) 77 # x = [int(i) for i in input().split(',')] 78 # 79 # def kpsort(x, first, last): 80 # font = first 81 # end = last 82 # middle = x[first] 83 # 84 # if first >= last: 85 # return 86 # 87 # while font < end: 88 # while font < end and x[font] <= middle: 89 # font += 1 90 # x[end] = x[font] 91 # 92 # while font < end and x[end] > middle: 93 # end -= 1 94 # x[font] = x[end] 95 # 96 # x[font] = middle 97 # 98 # kpsort(x, first, font - 1) 99 # kpsort(x, font + 1, last) 100 101 # 歸併排序 102 # 時間複雜度 O(nlogn) 空間複雜度 O(N) 103 x = [int(i) for i in input().split(',')] 104 105 def gbsort(x): 106 length = len(x) 107 if length <= 1: 108 return x 109 mid = length // 2 110 111 left = gbsort(x[:mid]) 112 right = gbsort(x[mid:]) 113 114 left_point, right_pointer = 0, 0 115 result = [] 116 117 while left_point < len(left) and right_pointer < len(right): 118 if left[left_point] <= right[right_pointer]: 119 result.append(left[left_point]) 120 left_point += 1 121 else: 122 result.append(right_pointer) 123 right_pointer += 1 124 125 result += left[left_point:] 126 result += right[right_pointer] 127 128 return result 129 130 print(gbsort(x))
5. 直通 BAT 算法題
這部分又包含三大塊:
二叉樹
棧和隊列
鏈表
在學習Python的過程當中,每每由於沒有資料或者沒人指導從而致使本身不想學下去了,所以我特地準備了個羣 592539176 ,羣裏有大量的PDF書籍、教程都給你們無償使用!無論是學習到哪一個階段的小夥伴均可以獲取到本身相對應的資料!
咱們來看一個示例:向有環的環形鏈表中插入新節點.py
1 # 指針給的是節點值 2 class Node(): 3 def __init__(self, value=None): 4 self.value = value 5 self.next = None 6 7 def insertnum(head, num): 8 node = Node(num) 9 if head == None: 10 node.next = node 11 return node 12 node = head 13 pre = node 14 cur = node.next 15 while cur != head: 16 if pre.value > num and cur.value <= num: 17 break 18 pre = pre.next 19 cur = cur.next 20 # num 小於節點值,pre只跑到最後一個節點,node跑道頭結點 21 pre.next = node 22 node.next = cur 23 # 是按順序來的,返回的是 head 或者 node ,是有順序決定的 24 return head if head.value < num else node 25 26 node = Node() 27 node.insertnum([[1, 2, 3], 5])
最後,通常學習 Python 的最好方法就是從底層算法開始實現一遍,過一遍基本函數與結構。有了充足的理解以後,就能夠直接刷 LeetCode 等。但願這份 Python 面試題集錦對你有所幫助!