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

这是牛客网中的一道题:
现在有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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,我可以回答这个问题。以下是解决方案: 1. 定义一个变量min,用于存储最小值,初始值为组第一个元素的值。 2. 定义个变量row和col,用于存储最小值所在的行和列,初始值为。 3. 使用双重循环遍历整个数组,比较每个元素的值是否小于min,如果是,则更新min的值,并更新row和col的值。 4. 循环结束后,row和col的值即为最小值所在的行和列。 以下是示例代码: int min = arr[][]; int row = , col = ; for (int i = ; i < m; i++) { for (int j = ; j < n; j++) { if (arr[i][j] < min) { min = arr[i][j]; row = i; col = j; } } } printf("最小值的位置为(%d, %d)", row, col); 希望能对您有所帮助。 ### 回答2: 可以使用循环遍历的方式找出最小值的位置。 首先,设定个变量min_num和min_index,分别用来存储最小值和最小值的位置。 然后,使用层循环来遍历二维组。外层循环控制行,内层循环控制列。 在遍历过程中,使用一个if语句来判断当前元素是否小于min_num。如果是,就更新min_num为当前元素的值,并更新min_index为当前的行、列下标。 最后,循环结束后,min_index就是最小值的位置,即所答案。 下面是示例代码: ```python m = len(arr) # m为行 n = len(arr[0]) # n为列 min_num = float('inf') # 将最小值设为正无穷大 min_index = (0, 0) # 初始化最小值的位置 for i in range(m): for j in range(n): if arr[i][j] < min_num: min_num = arr[i][j] min_index = (i, j) print("最小值的位置为:行", min_index[0], "列", min_index[1]) ``` 需要注意的是,这里使用float('inf')将最小值初始设置为正无穷大,以确保组中的任意元素都能比它小。在实际应用中,可以根据具体情况选择合适的初始值。 ### 回答3: 这是一个二维组中最小值位置的程序。我们先定义一个m行n列的二维组,并初始化其中的元素。然后使用个变量min_row和min_col来记录目前找到的最小值的位置。 首先,我们将最小值的位置设为组中的第一个元素,即min_row = 0, min_col = 0。然后我们遍历整个数组,比较每个元素与当前的最小值。如果找到比当前最小值更小的元素,我们将新的行、列下标赋给min_row和min_col。最后,遍历结束后,我们就可以得到最小值的位置。 以下是这个程序的具体实现: ```python def find_min_position(array): m = len(array) # 行 n = len(array[0]) # 列 min_row = 0 # 最小值所在的行下标 min_col = 0 # 最小值所在的列下标 for i in range(m): for j in range(n): if array[i][j] < array[min_row][min_col]: min_row = i min_col = j return min_row, min_col # 测试 array = [[3, 4, 1], [2, 5, 6], [8, 9, 7]] min_row, min_col = find_min_position(array) print("最小值的位置:行 = " + str(min_row) + ",列 = " + str(min_col)) ``` 运行结果: ``` 最小值的位置:行 = 0,列 = 2 ``` 因为3是最小,他位于第一行第三列,所以答案是行=0,列=2。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值