python最新筆試題
阿新 • • 發佈:2018-12-12
這是筆者面試小十家公司後嘔心瀝血總結的一些筆試程式設計題~具體公司就不透露了。哎,說多了都是淚啊。
1.二分法查詢:
l = [1, 2, 3, 4, 5, 6, 7, 8, 9] find_num = int(input('請輸入一個數字:')) start = 0 end = len(l) - 1 while True: middle = (start + end) // 2 if find_num == l[middle]: print('找到了!索引是:', middle) break elif find_num > l[middle]: start= middle + 1 elif find_num < l[middle]: end = middle - 1 if start > end: print('沒找到!', find_num) break
2.二分法查詢序列
#一個有序數列類似[1,2,3,3,4,4,5,5,5,6,7,8,8] #輸入5 用二分法 輸出 5 的起始下標和 末尾下標 def searchRange(nums, target): if len(nums) == 0: return [-1,-1]elif target < nums[0] or target > nums[-1]: return [-1,-1] else: l, r = 0, len(nums) - 1 while l <= r: mid = (l + r) // 2 if target > nums[mid]: l = mid + 1 elif target < nums[mid]: r = mid - 1 eliftarget == nums[mid]: l = r = mid while l-1 >= 0 and nums[l-1] == target: l -= 1 while r+1 <= len(nums)-1 and nums[r+1] == target: r += 1 return [l,r] return [-1,-1] nums = [1,3,4,6,8,8,9,10] a = searchRange(nums,8) print(a)
3.氣泡排序
''' 氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。 走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。 這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名“氣泡排序”。 ''' import random # 步驟2:建立一個空列表,用於存放待排序隨機資料集 data = [random.randint(0, 100) for i in range(10)] print('待排序的隨機數列: {0}'.format(data)) # 步驟3:使用巢狀迴圈實現氣泡排序 # 外層迴圈控制排序的次數 for i in range(10): # 內層迴圈控制每次對比的次數 for j in range(len(data)-1-i): # 如果前項值大於後項值則對位交換,將大的在列表中後移1位 if data[j] > data[j+1]: temp = data[j] data[j] = data[j+1] data[j+1] = temp pass # 步驟4:輸出排序後的結果 print('排序後的有序序列: {0}'.format(data)) #交換排序.氣泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L): for i in range(len(L)): for j in range(i+1,len(L)): if L[i]>L[j]: # temp = L[j] # L[j] = L[i] # L[i] = temp L[i], L[j] = L[j], L[i]#交換順序 print (L) Bubble_sort(L)
4.列表去重
ids = [1,2,3,3,4,2,3,4,5,6,1,6,4,3,2,3,] news_ids = [] for id in ids: if id not in news_ids: news_ids.append(id) print (news_ids) #python 列表去重(陣列)的幾種方法 - 朝陽的向日葵 - 部落格園 https://www.cnblogs.com/zknublx/p/6042295.html ids = list(set(ids)) print(ids) #一句話列表去重 #lambda 一句話列表去重 a=(lambda x,y:x if y in x else x + [y], [[],] + ids) print(a)
5.列表巢狀
l=[1,2,[3,4,[5,6],[7,8],9],10] l1=[] #遞迴函式實現: def getitem(l): for item in l: if isinstance(item,list): getitem(item) else: print(item) l1.append(item) getitem(l) print(l1) #python利用遞迴函式輸出巢狀列表的每個元素 - lincappu - 部落格園 https://www.cnblogs.com/lincappu/p/8146055.html
6.統計列表數值出現次數
a=[1,2,3,3,3,3,7,7,8,8,10] print(a) news_ids = [] for id in a: if id not in news_ids: news_ids.append(id) print (news_ids) for i in news_ids: if a.count(i) >= 1: print('%s 出現了%d 次!'%(i, a.count(i))) #純手寫
7.列表逆輸出
a=[0,1,2,3,4,5,6,7,8,9,10] b=[] print(a[::-1]) #逆輸出 #手寫程式碼 count=len(a) for i in range(len(a),0,-1): count-=1 b.append(a[count]) print(b)
8.字串統計
str='mynameisbobiamfromchina嘿嘿嘿嘿' str=','.join(str) #以逗號分隔字串 print(str) li=str.split(',') print(li) #變成列表了 #統計每一個字元出現的次數: for i in set(li): if li.count(i) >= 1: print('%s 出現了%d 次!'%(i, li.count(i))) print('*'*50) #方式二 from collections import Counter res = Counter(li) print(res)
9.位元組型字典
dic=b'{"name":"ltf","school":"tyut"}' str(dic, encoding="utf-8") print(dic) dicBytes = dic.decode('utf-8') print(dicBytes) print(eval(dicBytes)) #字串轉換為字典 print(eval(dicBytes).keys()) #修改key dict = {'a':'ltf','b':'fjf'} dict.update({'1':dict.pop("a")}) dict.update({'2':dict.pop("b")}) print(dict)
10.快速排序
#coding:utf-8 #author:徐卜靈 #交換排序.快速排序 # 雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:挖坑填數+分治法: # import sys # sys.setrecursionlimit(150000) L = [6, 3, 2, 32, 5, 4] def Fast_sort(L, left,right): if left >= right: return L key = L[left] low = left high = right while left < right: # if L[right] > key: # right-=1 # else: # L[left] = L[right] # if L[left] <= key: # left += 1 # else: # L[right] = L[left] # L[left] = key while left < right and L[right] >= key: right -= 1 L[left] = L[right] while left < right and L[left] <= key: left += 1 L[right] = L[left] L[left] = key Fast_sort(L, low, left - 1) Fast_sort(L,left + 1,high) return L print (Fast_sort(L,0,5)) #1.高質量程式碼 def quick_sort(lists, left, right): # 快速排序 if left >= right: return lists key = lists[left] low = left high = right while left < right: while left < right and lists[right] >= key: right -= 1 lists[left] = lists[right] while left < right and lists[left] <= key: left += 1 lists[right] = lists[left] lists[left] = key quick_sort(lists, low, left - 1) quick_sort(lists, left + 1, high) return lists print (quick_sort(L,0,5)) #2.高質量程式碼 # # 設定最低位和最高位 # def quickSort(nums, low, high): # # 設定一個比較基準key # key = nums[low] # while low<high: # # 如果最高位的數 大於等於 key則向前走 # while low<high and nums[high] >= key: # high -= 1 # # 如果最低位的數 小於等於 key則向後走 # while low<high and nums[low] <= key: # low += 1 # # 交換值 # nums[low], nums[high] = nums[high], nums[low] # # #最後low=high, 此時交換key和high位上的值, 使小於key的值在key左邊, 大的在key右邊 # nums[nums.index(key)], nums[low] = nums[low], nums[nums.index(key)] # # 返回最低位的位置 # return low # # # # 進行重複操作 # def interval(nums, low, high): # if low<high: # # 進行排序並得到最低位位置以迴圈操作 # key_index = quickSort(nums, low, high) # interval(nums, low, key_index) # interval(nums, key_index+1, high) # # # nums = [64,3,9,2,4,7,0,12,45,] # interval(nums, 0, len(nums)-1) # print nums #
11.列印三角形
for i in range(10): for j in range(0, 10 - i): print(end=" ") for k in range(10 - i, 10): print("*", end=" ") print("") for l in range(10): for m in range(l): print(" ",end="") for n in range(10-l): print("*",end=" ") print("")
12.數字轉中文輸出
num=[1,2,3,4,5,6,7,8,9,0] cn=['壹','貳','叄','肆','伍','陸','柒','捌','玖','零'] dw=['元','十','百','千','萬','十','百','千'] n=str(input('請輸入數字:')) c=len(n)-1 # print c ln='' c1=0 for i in n: nb = int(i) - 1 if i=='0' and c1==0: c1=1 pass else: if c1==1: c1=0 ln=ln+ cn[nb]+dw[c] print(ln) c=c-1 print(ln)
13.數字逆輸出
# num=input('請輸入一個數:') # a=[] # li=list(num) # print(li) # count=len(li) # for i in range(len(li),0,-1): # count-=1 # a.append(li[count]) # print(a) num=input('請輸入一個數:') a=[] str='' print(num) count=len(num) for i in range(len(num),0,-1): count-=1 a.append(num[count]) b=str.join(a) print(int(b))
14.斐波那契數列
#最簡單的方法為陣列,其次為迴圈,最垃圾的為遞迴,到了40就算好久。。日後再琢磨陣列 a=[1,1] def fn(n): count=0 f0=1 f1=1 f2=0 while count<n: count+=1 f2=f1+f0 f0=f1 f1=f2 a.append(f2) print('第%s項的項數為:%s'%(b,f2)) print('斐波那契數列為:') print(a) b=int(input('請輸入項數:')) fn(b-2)
15.有序數組合並
def merge_sort(a, b): ret = [] i = j = 0 while len(a) >= i + 1 and len(b) >= j + 1: if a[i] <= b[j]: ret.append(a[i]) i += 1 else: ret.append(b[j]) j += 1 if len(a) > i: ret += a[i:] if len(b) > j: ret += b[j:] return ret if __name__ == '__main__': a = [1,3,4,6,7,78,97,190] b = [2,5,6,8,10,12,14,16,18] print(merge_sort(a, b))
16.生成器
#如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢? # 這樣就不必建立完整的list,從而節省大量的空間。 # 在Python中,這種一邊迴圈一邊計算的機制,稱為生成器(Generator) def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 fib(8) #生成器呼叫方法,其實是
17.裝飾器
#裝飾器的應用場景:比如插入日誌,效能測試,事務處理,快取等等場景。 def outer(func): def inner(*args,**kwargs): print("認證成功!") result = func(*args,**kwargs) print("日誌新增成功") return result return inner @outer def f1(name,age): print("%s 正在連線業務部門1資料介面......"%name) # 呼叫方法 f1("jack",18) #裝飾器呼叫方法,其實是把函式 f1 當成 outer的引數
18.直接插入排序
#1.直接插入排序 L = [1, 3, 2, 32, 15, 5, 4] def Insert_sort(L): for i in range(1,len(L)): for j in range(0,i):#這裡面其實也是從前向後比較 if L[i]<L[j]: L.insert(j,L[i])#在不大於的位置插入L[i],這個時候,列表加長了1位,L[i]插入到指定位置了,但它的值也向後移動了一位 L.pop(i+1)#把原來L[i]的值刪除。 print(L) #空間複雜度為O(1),時間複雜度為O(n*n) Insert_sort(L) # print sorted(L)#自帶的兩種排序 # L.sort() # print L
19.簡單選擇排序
L = [6, 3, 2, 32, 5, 4] def Select_sort(L): for i in range(0,len(L)): for j in range(i,len(L)): if L[i] > L[j]: #打擂臺的形式 # temp = L[i] # L[i] = L[j] # L[j] = temp L[i],L[j] = L[j],L[i] return L print (Select_sort(L))
20.駝峰命名規則
''' bob_ltf 輸出 bobLtf ''' s='bob_ltf_lsq_fjf' s1='' s2='' arr=s.split('_') #列表 print(arr) s1=s1.join(arr[1:]) print(s1.capitalize()) s2=s2.join(arr[:1]) s3=s2+s1.capitalize() print(s3) ''' 輸出結果 ['bob', 'ltf', 'lsq', 'fjf'] Ltflsqfjf bobLtflsqfjf '''
暫時總結這麼多,以後的面試或者筆試題我也會加入到這裡面。。。筆試的時候全部要求手寫程式碼,而且不能用第三方庫的方法。。。這就很難受了
以上原始碼GitHub地址:
https://github.com/tyutltf/python_bishi/tree/master