1. 程式人生 > 實用技巧 >python面試演算法題

python面試演算法題

1
2
3
def num():
return [lambda x: i*x for i in range(4)]
print([m(2) for m in num()]) # 輸出: [6, 6, 6, 6]

思路:

這題涉及到了閉包延時繫結,當迴圈執行完了之後才會執行傳參,迴圈四次,每一次迴圈完 i=3 然後再和x相乘 所以結果是6,6,6,6。 如果把 [ lambda x: ix for i in range(4) ] 改成 ( lambda x: ix for i in range(4) )這樣就變成了一個生成器 自動實現迭代器協議,一邊迴圈一邊計算的機制, 這樣結果就是 0,2,4,6.


兩數之和

1
2
3
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路:

這裡可以使用字典來解題,通過enumerate方法遍歷獲取資料的下標包括對應值,然後以key,value形式把該資料的下標和對應值存入字典,然後再出通過enumerate方法遍歷資料,每一次獲取資料就從字典拿出一個值,用目標值減去從字典拿出的這個值得到一個結果值,如果結果值存在字典當中,那麼返回兩個數的下標,如果為None,說明字典中沒有這個值。

實現程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def get_index_list(nums, target):

# Todo 作為一個方法來實現,批量解決這個獲取索引的問題
"""
:params nums:傳的引數的列表
:params target: 目標值
:return: 返回索引
"""

dic = {}

for a, b in enumerate(nums): # a是下標 b是對應值

dic[b] = a # 對應值存入字典

for i, b in enumerate(nums):

j = dic.get(target-b) # 從字典中拿出對應值 用目標值減去對應值

if j is not None: # 判斷如果減去的對應值不為空,則返回下標

return [i, j]

陣列中重複的數字

示例:

1
2
3
輸入:
[2,3,1,0,2,5,3]
輸出: 2 或 3

思路:

這道題想到的是,使用列表中的count方法,定義一個空列表,遍歷資料然後進行判斷,如果資料值出現個數大於或等於2,說明該資料是重複的,然後把重複的篩取出來之後存入空列表,再進行返回輸出。

實現程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def get_number(nums):
"""
:params nums:傳的引數的陣列
:return: 返回重複數字
"""
nub = []

for i in nums:
if nums.count(i) >= 2:
if str(i) not in nub:
nub.append(str(i))

print('或'.join(nub))


if __name__ == "__main__":
get_number([2, 3, 1, 0, 2, 5, 3])

佇列實現一個棧

思路:

使用一個佇列,實現棧的一些基本操作,棧(後進先出)的特性。

實現程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 佇列實現一個棧 (棧:後進先出)
class Stack(object):

def __init__(self):
# 定義一個佇列
self.lst = []

def is_None(self):
# 判斷棧是否為空 返回 ture false
return self.lst == []

def push(self, i):
# 加入元素
self.lst.append(i)

def pop(self):
# 出棧
return self.lst.pop()

def stack_top(self):
# 返回棧頂元素
return self.lst[-1]

def size(self):
# 棧的大小
return len(self.lst)


if __name__ == "__main__":

stack = Stack()
print(stack.is_None())
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.lst)
print(stack.pop())
print(stack.stack_top())
print(stack.size())

迴文數

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例1:

1
2
輸入: 121
輸出: true

示例2:

1
2
3
輸入: -121
輸出: false
解釋: 從左向右,為 -121 。 從右向左讀,為121- 。 因此它不是一個迴文數

示例3:

1
2
3
輸入: 10
輸出: false
解釋: 從右向左讀,為 01 。 因此它不是一個迴文數

思路:

這題可以使用字串 雙指標的方法 將資料轉化為字串 首先定義好第一個元素下標和最後一個元素下標,while迴圈 只要條件不滿足 一直迴圈 迴圈判斷第一個和最後一個元素是否相等 不相等返回false 相等繼續迴圈,如果迴圈條件滿足之後都相等,返回 false

實現程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def palindromic_number(x):

"""
:params x:傳的引數的列表
:return: 返回Ture False
"""

lst = list(str(x))
print(lst)
L, R = 0, len(lst)-1

while L <= R:
print(L, R)
if lst[L] != lst[R]:
return False

L += 1
R -= 1
return True


if __name__ == "__main__":
print(palindromic_number(1231))

分別用生成器和迭代器生成斐波那契數列

示例:

1
輸出: 1 1 2 3 5 8 13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 使用迭代器生成斐波那契數列
class Fibonacii(object):
def __init__(self,all_num):
self.all_num = all_num
self.cur_idx = 0
self.a = 0
self.b = 1

def __iter__(self):
return self

def __next__(self):
if self.cur_idx >= self.all_num:
raise StopIteration
ret = self.a

self.a, self.b = self.b, self.a + self.b
self.cur_idx += 1
return ret

fibo = Fibonacii(10)
for i in fibo:
print(i)
1
2
3
4
5
6
7
8
9
10
11
12
13
# 使用生成器生成斐波那契數列
def fibnacii(count):
num = 0
a, b = 0, 1
while num < count:
yield a
a, b = b, a+b
num += 1


fi = fibnacii(10)
for i in fi:
print(i)

反轉字元陣列

思路:

直接使用反轉

實現程式碼:

1
2
3
4
5
6
7
8
# 反轉字串
def reverseString(s):
s[0::] = s[::-1]
print(s)


if __name__ == "__main__":
reverseString(['b', '', 'a', 'r'])