1023 组个最小数
分数 20
全屏浏览题目
切换布局
作者 CAO, Peng
单位 Google
给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
counts = input().split() # 获取输入的每个数字的数量
result = [] # 存储最终结果
# 处理特殊情况:找出第一个非零数字并添加到结果中
for i in range(1, 10):
if int(counts[i]) > 0:
result.append(str(i))
counts[i] = str(int(counts[i]) - 1)
break
# 添加剩余的数字到结果中
for i in range(10):
result.extend([str(i)] * int(counts[i]))
# 输出最小的组合数
print(''.join(result))
n = input().split()
# 构建数字串
num_strs = []
for i in range(len(n)):
num_strs.extend([str(i)] * int(n[i]))
# 找到最小非零数字的索引
min_index = 0
while num_strs[min_index] == '0':
min_index += 1
# 输出最小数
print(num_strs[min_index], end="")
# 输出剩余数字
for i in range(min_index):
print(num_strs[i], end="")
for i in range(min_index + 1, len(num_strs)):
print(num_strs[i], end="")
当用户输入一个由数字 0-9 的个数构成的列表时,代码首先将其以空格为分隔符进行拆分,并存储在变量 `n` 中。
接下来,用一个循环遍历 `n` 列表中的每个元素。对于当前索引位置 `i` 的元素,使用 `int(n[i])` 将其转换为整数类型,并重复字符 `str(i)` 这么多次。然后,把生成的字符序列添加到 `num_strs` 列表中。
之后,我们需要找到字符串中最小非零数字的索引。通过初始化 `min_index` 变量为 0,然后使用一个循环判断 `num_strs[min_index]` 是否等于 '0'。如果相等,则说明该位置上的数字是 0,继续递增 `min_index`,直至找到第一个不为 0 的数字。
现在我们已经确定了最小非零数字在整个字符串中的位置。下一步是按照题目要求输出结果。
首先,使用 `print()` 函数并指定参数 `end=""` 来打印出最小数(`num_strs[min_index]`),即最小非零数字。
接着,我们使用两个循环来打印位于最小数之前和之后的数字。第一个循环从索引 0 到 `min_index-1`,逐个打印位于最小数之前的数字。第二个循环从 `min_index+1` 到 `num_strs` 的长度,逐个打印位于最小数之后的数字。
通过这些步骤,我们可以得到问题要求的组成的最小数。
在这个代码片段中,[str(i)] * int(n[i])
的目的是生成一个包含重复元素的列表。
int(n[i])
:对于给定输入列表n
中的第i
个元素,使用int()
函数将其转换为整数类型。str(i)
:将当前索引位置i
转换为对应的字符串表示。[str(i)] * int(n[i])
:创建一个新的列表,其中包含重复的字符序列,该字符序列由当前索引位置i
的字符串形式组成,并且重复次数等于对应元素值(即根据int(n[i])
)。
举个例子来说,假设我们有以下输入列表 n
:[3, 2, 1]
。
- 第一个元素是
3
。经过操作后,会生成一个包含三个'0'
的列表:['0', '0', '0']
。 - 第二个元素是
2
。这样会生成一个包含两个'1'
的列表:['1', '1']
。 - 第三个元素是
1
。最终会生成一个包含一个'2'
的列表:['2']
。
现在,我们需要将上述结果通过 extend()
方法添加到 num_strs
列表中。逐个添加,最终得到的 num_strs
是:['0', '0', '0', '1', '1', '2']
。
这段代码是一个简单的数字处理程序,它的主要功能是将输入的数字列表转换为一个数字串,并且找到该数字串中最小的非零数字,并输出。下面是代码的解释:
-
第一行代码
n = input().split()
获取用户输入的一行字符串,并使用 split() 方法将其分割为一个数字列表。例如,如果用户输入 "12345",则 n 的值为['1', '2', '3', '4', '5']
。 -
接下来的代码使用一个循环来构建数字串
num_strs
。循环从 0 到列表n
的长度,对于每个索引i
,将数字i
重复n[i]
次,并将其添加到num_strs
列表中。例如,如果n
的值为['1', '2', '3', '4', '5']
,则num_strs
的值为['0', '1', '1', '2', '2', '2', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', '5']
。 -
下一部分代码用于找到最小非零数字的索引。使用一个 while 循环,判断
num_strs[min_index]
是否为零。如果是零,则将min_index
加一,继续判断下一个元素,直到找到第一个非零元素的索引位置。 -
然后,使用
print(num_strs[min_index], end="")
输出最小的非零数字。end=""
参数是为了在输出时不换行。 -
最后两个循环用于输出剩余的数字。第一个循环从 0 到
min_index
,输出num_strs
中索引小于min_index
的元素;第二个循环从min_index + 1
到len(num_strs)
,输出num_strs
中索引大于min_index
的元素。
总而言之,这段代码的功能是将输入的数字列表转换为数字串,并输出其中最小的非零数字及剩余数字。