1023. 组个最小数 (20)-----Python

本题的考虑点:

(1)列表中存储的是相应位置的个数,实际要储存的是所在的位置,因此使用flag来记录所处理数据的位置。

(2)考虑清楚第一个位置,也就是0的个数,我把0的个数单独拿出来分析的,使用pop将第一个数据从列表中删除,然后判断其是否为零,若不为零的话,单独考虑,因为其不为零,所以就是在剩下的列表中找到第一个非零的所在位置,把此数据所在的位置存储到结果数列中,然后再把数据减一。再接下来的执行就是常规的执行,剩余的数列,找到数列中的每一个非零数据,将数据所在位置按数据的个数存储到新的列表中,最后将列表转换为字符串输出即可。

(3)需要注意的就是要弄清楚原始列表中存储的仅是个数,真正应该存储到新列表的是数据所在的位置。可以说Python真的很好用。再见

def get_in():
	string = input()
	list = []
	for num in string.split():
		list.append(int(num))
	return list
	
def get_result(list):
	first_num = list.pop(0)
	sum_list = [] 
	if first_num != 0:
		flag = 0
		while True:
			if list[flag] != 0:
				list[flag] -= 1
				break
			else:
				flag += 1
		sum_list.append(flag + 1)
		while first_num:
			sum_list.append(0)
			first_num -= 1
	
	flag = 1
	for num in list:
		if num != 0:
			while num:
				sum_list.append(flag)
				num -= 1
		flag += 1
	return sum_list
		
my_list = get_in()
list = get_result(my_list)
my_str = ''
for num in list:
	my_str += str(num)
print(my_str)



题目描述: 给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得后得到的数尽可能小(注意0不能做首位)。 例如: 给定两个0,两个1,三个5,一个8,我们得到的答案应该是10015558。 现在,请你输出一个整数,表示小的可能得到的数。 输入格式 每个输入包含 1 个测试用例。每个测试用例在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。 输出格式 在一行中输出能够成的小的数。 输入样例 2 2 0 0 0 3 0 0 1 0 输出样例 10015558 算法1 (贪心) $O(n)$ 题目要求小的数,那么按照贪心的思想,我们应该把小的数放在高位,次小的数放在第二高位,以此类推,后把剩下的数字按从小到大的顺序填充在后面。 具体做法如下: 1.先把所有数字的数量统计出来。 2.从1-9中,从小到大遍历每个数字,如果当前数字有数量,则把该数字添加到答案中,并把该数字的数量减1。 3.后把剩下的0全部加到答案的末尾即可。 时间复杂度 贪心算法只需要遍历一遍数字,所以时间复杂度是O(n)。 空间复杂度 只需要额外使用常数个变量,所以空间复杂度是O(1)。 C++ 代码 ```cpp #include <iostream> using namespace std; int a[10]; int main() { for (int i = 0; i < 10; i ++ ) cin >> a[i]; for (int i = 1; i < 10; i ++ ) if (a[i]) { cout << i; a[i] -- ; break; } for (int i = 0; i < 10; i ++ ) for (int j = 0; j < a[i]; j ++ ) cout << i; cout << endl; return 0; } ``` Python3 代码 ```python a = list(map(int, input().split())) for i in range(1, 10): if a[i]: print(i, end='') a[i] -= 1 break for i in range(10): print(str(i) * a[i], end='') print() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值