1. 程式人生 > >python最新筆試題

python最新筆試題

這是筆者面試小十家公司後嘔心瀝血總結的一些筆試程式設計題~具體公司就不透露了。哎,說多了都是淚啊。

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 elif
target == 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