200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!
點擊上方“AI有道”,選擇“置頂”公眾號
重磅干貨,第一時間送達
春招臨近,無論是要找工作的準畢業生,還是身在職場想要提升自己的程序員,提升自己的算法內功心法、提升?Python?編程能力,總是大有裨益的。今天,紅色石頭發現了一份好資源:Python?實現的面試題集錦!
這份資源名為:Interview-code-practice-python!包含了幾百道算法面試題,而且全都使用?Python?編寫了答案。有問有答,學得豈不快哉~
好了,話不多說,直接放上這份面試集錦的?GitHub?地址:
https://github.com/leeguandong/Interview-code-practice-python
這個項目資源總共包含了?5?個方面的真題,分別是:2017?校招真題、劍指?offer、華為機試、機試題、直通?BAT?算法題。
接下來,我們分別來看一下具體內容。
1. 2017 校招真題
這部分包含了?37?道?2017?年的校招真題。
每個題目都配備相應的?Python?實現。例如我們來看一個有趣的例子:餐廳.py
# 在 m 批客人中選擇 n 批上 n 個桌子 n, m = [int(x) for x in input().split()] # 每個桌子可容納的最大人數 table = [int(x) for x in input().split()] # 分別表示第 i 批客人的人數和預計消費金額 cus = [[int(x) for x in input().split()] for i in range(m)]# 將桌子按可容納人數從小到大排列 table.sort() # 按每批顧客的人數從小到大排序 cus = sorted(cus, key=lambda?x:?x[0]) # 總金額 money = 0for i in?range(n):# 盛放第 i 個可接受的顧客批 jtemp = []# 注意 range 中要用 cus 的 length 時更新for j in?range(len(cus)):if cus[j][0]?>?table[i]:breaktemp.append(cus[j])# 按消費金額排序temp = sorted(temp, key=lambda?x:?x[1])if?temp:money += temp[-1][1]# 此批客人已就坐cus.remove() print(money)2. 劍指 offer
這部分共包含了?68?道劍指真題。
請看示例:變態青蛙跳.py
''' 題目:一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法 '''''' 因為n級臺階,第一步有n種跳法:跳1級、跳2級、到跳n級 跳1級,剩下n-1級,則剩下跳法是f(n-1) 跳2級,剩下n-2級,則剩下跳法是f(n-2) 所以f(n)=f(n-1)+f(n-2)+...+f(1) 因為f(n-1)=f(n-2)+f(n-3)+...+f(1) 所以f(n)=2*f(n-1) 然后求解這個無窮級數的和,正確答案應該是:每次至少跳一個,至多跳n個,一共有f(n)=2n-1種跳法 29ms 5632k '''#?-*-?coding:utf-8?-*- class Solution:def jumpFloorII(self, number):# write code herereturn 2**(number-1)3. 華為機試
這部分包含?41?道華為機試題。
請看示例:密碼驗證合格程序.py
''' 1.長度超過8位 2.包括大小寫字母.數字.其它符號,以上四種至少三種 3.不能有相同長度超2的子串重復 說明:長度超過2的子串 '''# import re, sys # #?for?i?in?sys.stdin.readlines(): # print("OK" if len(i.strip()) > 8 and sum( # [1 if re.search(r"[A-Z]", i.strip()) else 0, 1 if re.search(r"[a-z]", i.strip()) else 0, # 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( #?????????map(lambda?c:?i.strip().count(i.strip()[c:c?+?3])?>?1,?range(1,?len(i.strip())?-?3)))?==?0?else?"NG")#?略微思考會發現,只需要判斷長度為3的子串是否出現即可。因為假設子串長度為4的出現,則一定包括了長度為3的子串。同時需要注意, # 本題說的子串指包括了部分子串重疊的情況, #?例如Qw11111*ed這個是不能通過的。再就是需要注意,判斷子串的時候只需要判斷到len(str)-3就行了。import systry:# 大小寫,字母,def panchar(sss):standard = [0] * 4for i in?sss:# print(i)# 0# 2# 1# A# b# print(len(sss))# 數字if?i.isdigit():standard[0] = 1# print(i.isdigit())# 小寫if?i.islower():standard[1] = 1# 大寫if?i.isupper():standard[2] = 1# 全都是字母,數字,空格if not i.isalpha() and not i.isdigit() and not?i.isspace():standard[3] = 1if sum(standard) >= 3:return Falsereturn True# 不能有相同長度超 2 的字串重復def zichuan(sss):for i in range(len(sss) - 3):zichuan_1?=?sss[i:?i?+?3]zichuan_2 = sss[i + 1::]if zichuan_1 in?zichuan_2:return Truereturn Falseresult = []while True:line = sys.stdin.readline().strip()if line == '':breakif len(line) <= 8:result.append('NG')# 大小寫字母.數字.其它符號elif?panchar(line):result.append('NG')elif?zichuan(line):result.append('NG')else:result.append('OK')for i in?result:print(i) except:pass# # 循環輸入,try catch #?while?True: #?????try: # x = input().split() # # #?????except: # pass4. 機試題
這部分包含?3?道機試題。
請看示例:排序.py
#?https://blog.csdn.net/u012193416/article/details/78790448 # # 冒泡排序 # # 時間復雜度 O(n**2) 空間復雜度 O(1) # x = [int(i) for i in input().split(',')] # # # print(x) # #?def?mpsort(x): # n = len(x) # # print(n) # for i in?range(n?-?1): # for j in?range(0,?n?-?i?-?1): # # print(x[j]) # if?x[j]?>?x[j?+?1]: # x[j], x[j + 1] = x[j + 1], x[j] # return x # # print(mpsort(x))# # 選擇排序 # # 時間復雜度 O(n**2) 空間復雜度 O(1) # x = [int(i) for i in input().split(',')] # #?def?xzsort(x): # n = len(x) # for i in?range(n?-?1): # min = i # for j in?range(i?+?1,?n): # if?x[j]?<?x[min]: # min = j # x[i], x[min] = x[min], x[i] # return x # # print(xzsort(x))# # 插入排序 # # 時間復雜度 O(n**2) 空間復雜度 O(1) # x = [int(i) for i in input().split(',')] # #?def?crsort(x): # n = len(x) # for i in?range(1,?n): # j = i # while?j?>?0: # if?x[j]?<?x[j?-?1]: # x[j], x[j - 1] = x[j - 1], x[j] # j -= 1 # else: # break # return x # # print(crsort(x))# # 希爾排序 # # 時間復雜度 O(nlogn)-O(n**2) 空間復雜度 O(1) # x = [int(i) for i in input().split(',')] # #?def?shellsort(x): # n = len(x) # gap = n // 2 # # while?gap?>?0: # for i in?range(gap,?n): # j = i # while?j?>?0: # if?x[j]?<?x[j?-?gap]: # x[j], x[j - gap] = x[j - gap], x[j] # j -= gap # else: # break # gap //= 2 # return x # # print(shellsort(x))# # 快速排序 # # 時間復雜度 O(nlogn) 空間復雜度 O(logn)-O(n) # x = [int(i) for i in input().split(',')] # #?def?kpsort(x,?first,?last): # font = first # end = last # middle = x[first] # # if?first?>=?last: # return # # while?font?<?end: # while?font?<?end?and?x[font]?<=?middle: # font += 1 # x[end] = x[font] # # while?font?<?end?and?x[end]?>?middle: # end -= 1 # x[font] = x[end] # # x[font] = middle # # kpsort(x, first, font - 1) # kpsort(x, font + 1, last)# 歸并排序 # 時間復雜度 O(nlogn) 空間復雜度 O(N) x = [int(i) for i in input().split(',')]def?gbsort(x):length = len(x)if?length?<=?1:return xmid = length // 2left?=?gbsort(x[:mid])right?=?gbsort(x[mid:])left_point, right_pointer = 0, 0result = []while?left_point?<?len(left)?and?right_pointer?<?len(right):if?left[left_point]?<=?right[right_pointer]:result.append(left[left_point])left_point += 1else:result.append(right_pointer)right_pointer += 1result?+=?left[left_point:]result += right[right_pointer]return resultprint(gbsort(x))5. 直通 BAT 算法題
這部分又包含三大塊:
二叉樹
棧和隊列
鏈表
我們來看一個示例:向有環的環形鏈表中插入新節點.py
# 指針給的是節點值 class Node():def __init__(self, value=None):self.value = valueself.next = Nonedef insertnum(head, num):node = Node(num)if head == None:node.next = nodereturn nodenode = headpre = nodecur = node.nextwhile?cur?!=?head:if pre.value > num and cur.value <= num:breakpre = pre.nextcur = cur.next# num 小于節點值,pre只跑到最后一個節點,node跑道頭結點pre.next = nodenode.next = cur# 是按順序來的,返回的是 head 或者 node ,是有順序決定的return head if head.value < num else nodenode = Node() node.insertnum([[1, 2, 3], 5])最后,一般學習?Python?的最好方法就是從底層算法開始實現一遍,過一遍基本函數與結構。有了充足的理解之后,就可以直接刷?LeetCode?等。希望這份?Python?面試題集錦對你有所幫助!
【推薦閱讀】
干貨 | 公眾號歷史文章精選(附資源)
我的深度學習入門路線
我的機器學習入門路線圖
你正在看嗎???
總結
以上是生活随笔為你收集整理的200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 737 页《吴恩达深度学习核心笔记》发布
- 下一篇: 从系统中取得指定资源图像(转载)