2019快手春招笔试A卷编程题3道

2019快手春招笔试编程题【Python】

  1. 统计一个数组中出现奇数次的数字,只出现了一次。
    解:
    笨办法:统计数组出现的次数,然后判断是否为奇数。存在的问题:运行时间和复杂度不合格。
import sys
n = int(input())
data = map(int, raw_input().split())
m = set(data)
dict = {}
for i in m:
     dict[i] = data.count(i)
     if dict[i]%2 == 1:
         print i
         break

另外一种极其简单的办法,使用异或运算
eg. 1^1 = 0 ; 2 ^ 2 = 0; 3 ^ 2 ^ 2 = 3; 3 ^ 3 ^ 2 ^ 2 = 0;
异或满足结合律,所以偶数个会为0,奇数个为它本身。

import sys
n = int(input())
data = map(int, raw_input().split())
odd = 0
for i in data:
     odd = odd ^ i
print odd
  1. 有一个长度为n的正整数序列,判断是否为非递减序列。如果其中有一个数是大于后一个数可以将其变为小的一个数。例如:[3, 4, 6, 5, 5, 5, 7, 8]可以将6换成4,那么数组是一组非递减序列。如果是非递减序列,那么输出1, 不是非递减序列输出0.
    解:
    主要使用逐个移动不重复比较的方法,并且记录后一项大于前一项的个数count,如果count<=1:那么就是非递减序列,如果count >1,证明至少有两次以上出现了递减情况。
import sys
data = map(int, raw_input().split())
count = 0
for i in range(n-1):
     if data[i+1] < data[i]:
          count += 1
if count > 1:
     print 0
else:
     print 1

3.设计一个计算器。
实现 + - × 运算。
eg. 1+1; 345; ((3-4)*2)*5这样的。
没做完,其实是自己数据结构学的很不好,几乎没有基础,有时间好好学习一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值