1. A+B
题目
- 描述:和所有的 OJ 平台一样,第一题作为热身题,也是送分题:给出两个非负数 a 和 b,输出 a+b 的结果。
- 输入:多组输入。包含两个非负数 a 和 b,以空格分隔;a 和 b 保证小于 2^32.
- 输出:你的输出是对一行数据处理的结果,也即 a+b 的结果。
思路
本题就是a+b的问题,不要想的太复杂,我一开始就是……
通过sys
模块的标准输入stdin
读取每行数据,并用split()
函数对数据分组,分别用a、b取值,再计算a+b即可。
代码
import sys
for line in sys.stdin:
[a, b] = line.strip().split()
print(int(a)+int(b))
2. 找出单独出现的数字
题目
- 描述:给出N个数字。其中仅有一个数字出现过一次,其他数字均出现过两次,找出这个出现且只出现过一次的数字。要求时间和空间复杂度最小。
- 输入:输入多个数字,每个数字以空格分开。数字数量 N < 20,输入数字的最大值小于 256
- 输出:输出内容为只出现过唯一一次的数字。
思路
重复数字出现的次数为偶数次(两次),因此可以用异或来找出单独的数字。
此外还可以遍历数组来找到单独的数字,不过相较异或效率更低。
代码
import sys
for line in sys.stdin:
l = line.strip().split()
single = 0
for i in l:
single = single^int(i) # 异或
print(single)
3. 大数相减
题目
- 描述:两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等。
- 输入:有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位。规定 a>=b,a, b > 0。 测试结果可以用 linux 小工具 bc 进行测试是否正确。
- 输出:返回结果为表示整数的字符串。
思路
用python做科学计算实在是太方便了,即便超过百位也照样和普通数一样算。不过需要注意一点:在从标准输入读取到的减法算式,对其分组的时候,默认最大字符串长度为64位(因平台而异),超过此长度会以空格隔开,因此注意去掉空格。
代码
import sys
for line in sys.stdin:
[a,b]=line.strip().split('-')
a = a.replace(' ', '') # 去空格
b = b.replace(' ', '') # 去空格
print(int(a)-int(b))
4. 最长连续数列
题目
- 描述:输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n) 。
- 输入:54,55,300,12,56
- 输出:3
思路
先对数列进行排序,然后遍历数列记录每个连续数列的长度,并且进行比较取最大值。
代码
import sys
for line in sys.stdin:
s = line.strip().split(',')
s.sort(key=int) # 按照整数顺序排序
temp=max = 1
for i in range(len(s)-1):
if int(s[i+1])-int(s[i])==1:
temp +=1
elif max<temp:
max=temp
else:
pass
if max<temp:
print(temp)
else:
print(max)
5. 找出旋转有序数列的中间值
题目
- 描述:给出一个有序数列随机旋转之后的数列,如原有序数列为:[0,1,2,4,5,6,7] ,旋转之后为[4,5,6,7,0,1,2]。 假定数列中无重复元素,且数列长度为奇数。 求出旋转数列的中间值。如数列[4,5,6,7,0,1,2]的中间值为4。
- 输入:4,5,6,7,0,1,2
- 输出:4
思路
先对数列排序,然后打印索引值中值所对应的数字。
代码
import sys
for line in sys.stdin:
s = line.strip().split(',')
s.sort(key=int)
print(s[int((len(s)-1)/2)])