春招臨近,無論是要找工作的準畢業生,還是身在職場想要提升自己的程式設計師,提升自己的演算法內功心法、提升 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 = 0
for i in range(n):
# 盛放第 i 個可接受的顧客批 j
temp = []
# 注意 range 中要用 cus 的 length 時更新
for j in range(len(cus)):
if cus[j][0] > table[i]:
break
temp.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 here
return 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 sys
try:
# 大小寫,字母,
def panchar(sss):
standard = [0] * 4
for 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] = 1
if sum(standard) >= 3:
return False
return 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 True
return False
result = []
while True:
line = sys.stdin.readline().strip()
if line == '':
break
if 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:
# pass
4. 機試題
這部分包含 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 x
mid = length // 2
left = gbsort(x[:mid])
right = gbsort(x[mid:])
left_point, right_pointer = 0, 0
result = []
while left_point < len(left) and right_pointer < len(right):
if left[left_point] <= right[right_pointer]:
result.append(left[left_point])
left_point += 1
else:
result.append(right_pointer)
right_pointer += 1
result += left[left_point:]
result += right[right_pointer]
return result
print(gbsort(x))
5. 直通 BAT 演算法題
這部分又包含三大塊:
- 二叉樹
-
棧和佇列
-
連結串列
我們來看一個示例:向有環的環形連結串列中插入新節點.py
# 指標給的是節點值
class Node():
def __init__(self, value=None):
self.value = value
self.next = None
def insertnum(head, num):
node = Node(num)
if head == None:
node.next = node
return node
node = head
pre = node
cur = node.next
while cur != head:
if pre.value > num and cur.value <= num:
break
pre = pre.next
cur = cur.next
# num 小於節點值,pre只跑到最後一個節點,node跑道頭結點
pre.next = node
node.next = cur
# 是按順序來的,返回的是 head 或者 node ,是有順序決定的
return head if head.value < num else node
node = Node()
node.insertnum([[1, 2, 3], 5])
最後,一般學習 Python 的最好方法就是從底層演算法開始實現一遍,過一遍基本函式與結構。有了充足的理解之後,就可以直接刷 LeetCode 等。希望這份 Python 面試題集錦對你有所幫助!