Stay hungry, Stay foolish

python解小米OJ赛题(1-5题)

Posted on By zzk

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)])