1. 程式人生 > >python web後端,筆試面試題五

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