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

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值