python web後端,筆試面試題五
Python筆試題
一、程式設計題,需考慮輸入合法性,時間和空間複雜度,注意:可以用標準庫函式或者自己知道的常用庫函式操作,如果不記得,需要自己寫原始程式碼實現,但必質保證是可以執行的
1.合併兩個有序的陣列,陣列都是非遞減的,合併後的陣列依然有序
方法一:
def merge_sort(a, b):
ret = []
while len(a) > 0 and len(b) > 0:
if a[0] <= b[0]:
ret.append(a[0])
a.remove(a[0])
if a[0] >= b[0]:
ret.append(b[0])
b.remove(b[0])
if len(a) == 0:
ret += b
if len(b) == 0:
ret += a
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))
方法二:
a = [1, 3, 4, 6, 7, 78, 97, 190]
b = [2, 5, 6, 8, 10, 12, 14, 16, 18]
c = a + b
c = set(c)
c = list(c)
print(c)
2.求n階乘結果末尾連續0的個數,如5!=120,末尾0的個數為1
方法一:
import re
while 1:
print('[*] --> n! (n>4 and n=N*)')
try:
x=int(input('n=:'))
x=range(x+1)[1:]
y=1
for i in x:
y=i*y
y=str(y)
def count_0(y):
rex=r'(0+\b)'
read=re.findall(rex,y)
return read
a=count_0(y)
except:
print('輸入有誤!\n')
else:
print('結果:%s\n末尾零數:%d\n'%(y,len(a[0])))
方法二:
n = int(input("輸入一個數字:"))
s = 0
n1 = n
while n > 0:
s = s + n // 5
n //= 5
print(n1 ,'!末尾有', s, '個0')
計算出階乘可以用下面的程式碼:
def test(n):
if n == 0:
return 1
else:
return n * test(n - 1)
ret = test(10)
print(ret)
我的思考過程是這樣的:
1)如果將階乘結果計算出來的話,求零可以採用能不能整出10的倍數來看,或者將結果轉為字串,利用str.count()求’0’的個數。
2)但是計算階乘要不用遞迴要不用遞推,執行時間都要很長,無法滿足題目中的logn要求。
3)於是想到求0也就是求其中2*5的個數,也就是5的個數,因為每一個偶數都含2,只要有5肯定有2。然後我就遍歷求能不能被5整除了。。。好蠢。。。還遍歷
4)正確的做法是使用n除以5。
3.反轉數字,例如:輸入123,輸出321;輸入-123,輸出-321:輸入1032100,輸出12301
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
# 判斷是否為個位數,是個位數則不用反轉,直接返回
if -10 < x < 10:
return x
# 把整數x轉為字串
str_x = str(x)
# 判斷第一個是否為負號
if str_x[0] != "-":
# 不是負號則直接反轉
str_x = str_x[::-1]
# str轉為int
x = int(str_x)
else:
# 是負號,則反轉負號之後的字串
str_x = str_x[1:][::-1]
# str轉int
x = int(str_x)
# 加上負號
x = -x
# 三目運算子,判斷是否溢位
# 如果-2147483648 < x < 2147483647則返回x,否則返回0,所有語言的最大正整數
return x if -2147483648 < x < 2147483647 else 0
if __name__ == '__main__':
s = Solution()
reverse_int = s.reverse(-123123123000)
print(reverse_int)
4.求股極限收益,給出一個數組,表示股價的走勢,陣列中每個元素代表股票當時的價格。你可以在任何時間點進行交易(即對股票的買入或賣出,但是買入和賣出不能同時進行,且最多隻能擁有1股),可以進行多次交易。設計一個法,求出理論上的極限收益
問題:待解決
5. 找出字串中連續的A
s = 'AABBBABAAAABBB'
for i in range(len(s)):
s1 = ''
s2 = ''
for j in range(len(s)-i):
s1 = s1+'A'
s2 = s2+'B'
if s1 in s:
print (u"最長連續字串:"+s1)
break
if s2 in s:
print (u"最長連續字串:"+s2)
break