任意给定一列数,让其组成两个数,求这两个数的最小和

这是牛客网中的一道题:
现在有n个0到9的数字,需要用它们组成两个数,这两个数都不能有前导0,使得这两个数加起来最小。
输入数据格式如下:
4 #第一行表示有几个数
1 0 2 3 #第二行给出具体的数
输出格式:
33
注意:
1、当第二行所给数字少于第一行时,缺的数字按最后一个数字补齐,例如
4
5 2 3 #实际是5 2 3 3
2、组成的两个数的最高位不能是0,即样例中不能出现01+23的情况
3、n要求不小于2,且非零数不少于2,第二行的数字均为个位数
利用python求解代码如下

def adaptlist(B):
    # 将一个列表中的零元素和非零元素分开
    # c中存储的是零元素,d中存储的是非零元素
    c = list()
    d = list()
    for b in B:
        if b == 0:
            c.append(b)
        else:
            d.append(b)
    return (c, d)

# 数据的输入及相关处理


def getnumber(d):
    # 将选取的两个数分别存入num1,num2中
    num1 = list()
    num2 = list()
    for i in range(0, len(d)):
        if i % 2 == 0:
            num1.append(d[i])
        else:
            num2.append(d[i])
    return (num1, num2)


def list2number(num):
    # 将list中的元素变成一个数
    a = 0
    for i in range(0, len(num)):
        a = a + num[i] * 10**(len(num) - i - 1)
    return a


# 标准输入
import sys
# 这里考虑一行数据里有多个数据,所以我们用二维list来进行存储
num = [[0 for col in range(0)] for row in range(2)]
s = sys.stdin.readline().strip()  # 得到第一行的数据
for i in range(2):
    temp = s.split()  # 删掉字符串的首尾空格
    num[i] = list(range(len(temp)))
    for kk in range(len(temp)):
        num[i][kk] = int(temp[kk])
    s = sys.stdin.readline().strip()


# 数据的处理
# 将输入的一些数据组成两个数,使得这两个数加起来最小
# 显然位数越小和最小,比如8个数组成两个四位数和最小,7个数组成4位数加3位数和最小
# 将除零以外的最小的两个数做为这两个数的首位,其余的数按从小到大的数排列
# 首先将输入的数据在list中从小到大进行排列,并保证第一个数不是0
# 在这里调用sort函数(也可以用sorted函数,这里就不再赘述)
# b = list(map(int, b))


b = num[1]  # 得到输入的数
# 判断输入的数字是否需要补齐
k = b[-1]
m = num[0][0] - len(b)
if m != 0:
    for i in range(0, m):
        b.append(k)
c, d = adaptlist(b)
# 确定组成的两个数位数分别是多少
d.sort()  # 将所有非零元素按从小到大的顺序排列

if c != []:
    for x in c:
        d.insert(2, x)
num1, num2 = getnumber(d)
print("num1=", num1, "num2=", num2)
a = list2number(num1)
b = list2number(num2)
print(a + b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值