怎么简化我的代码?纯新手
卡片题目:
小蓝有很多数字卡片,每张卡片上都是数字 0到9
小蓝准备用这些卡片来拼一些数,例如小蓝有 30 张卡片,其中 0到9 各3张,则小蓝可以拼出 1到10,
但是拼11时卡片1已经只有一张了,不够拼出11
现在小蓝手里有 0到9 的卡片各 2021 张,共20210张,请问小蓝可以从 1 拼到多少?
a = b = c = d = e = f = g = h = i = j = 2021
# 0到9 卡片的张数都是2021张
number = 1
while a > 0 and b > 0 and c > 0 and d > 0 and e > 0 and f > 0 and g > 0 and h > 0 and i > 0 and j > 0:
a -= str(number).count("0")
b -= str(number).count("1")
c -= str(number).count("2")
d -= str(number).count("3")
e -= str(number).count("4")
f -= str(number).count("5")
g -= str(number).count("6")
h -= str(number).count("7")
i -= str(number).count("8")
j -= str(number).count("9")
number += 1
if a <= 0 or b <= 0 or c <= 0 or d <= 0 or e <= 0 or f <= 0 or g <= 0 or h<= 0 or i <= 0 or j <= 0:
number -= 1
print(number)
感谢大佬 本帖最后由 元豪 于 2023-2-19 18:31 编辑
个人比较喜欢用列表
u = * 10
# 0到9 卡片的张数都是2021张
o = False
number = 1
while sum(u) > 0:
for i in range(1, 11):
# print(str(number).count(str(i)))
u -= str(number).count(str(i))
if u < 0:
o = True
if o:
break
number += 1
number -= 1
print(number)
最后一个if可以去掉 , 因为已经跳出循环表示肯定 <= 0 了 小蓝准备用这些卡片来拼一些数,例如小蓝有 30 张卡片,其中 0到9 各3张,则小蓝可以拼出 1到10,
什么意思?
0到9 各3张,那么 则小蓝可以拼出 1到10 是什么意思?
怎么拼出的10 ?
不是3张么?
999行不?
从0到999有问题么?
或者说从000到999这样?
3张都选9么?不可以?
但是拼11时卡片1已经只有一张了,不够拼出11
一共有几张1?
3张吧?
怎么,就能用1张1?
可能是我的理解能力不行吧
反正我是看不懂你这题目
lst = * 10
isbreak = False
n = 1
while sum(lst) > 0:
for i in range(10):
lst -= str(n).count(str(i))
if lst < 0:
isbreak = True
if isbreak:
break
n += 1
n -= 1
print(n) 哦,原来是使用过的卡片之后就不能用了,卡片是一次性的,早说么
#!/usr/bin/env python
#coding=utf-8
import itertools
def count_if(iterable, condition):
result = 0
for i in iterable:
if condition(i): result += 1
return result
def card_count(n):
card = 10 *
for i in itertools.count():
for j in range(len(card)):
card -= str(i).count(str(j))
if count_if(card, lambda x: x < 0):
return i - 1
print(card_count(3))
元豪 发表于 2023-2-19 18:30
个人比较喜欢用列表
倒数第二行代码 为什么要number-1呢?这里我没看懂{:10_254:} {:10_333:} 无理想的闲鱼 发表于 2023-2-20 11:14
倒数第二行代码 为什么要number-1呢?这里我没看懂
这里原来是你的if语句 , 但是可以删除掉 hveagle 发表于 2023-2-19 18:42
你确定不是我的代码只是换了一下变量名{:10_334:} counts = *10
number = 1
while all(x > 0 for x in counts):
counts =
number += 1
print(number - 1) 可以使用列表和循环来减少代码的冗余,并使用更高效的算法。下面是一个优化过的代码:
python
Copy code
nums = * 10# 使用列表代替重复赋值操作
number = 1
while all(num > 0 for num in nums):# 使用 all 函数判断列表中的所有元素是否都大于 0
for digit in str(number):
nums -= 1
number += 1
print(number - 1)# 减一是因为在最后一次循环中 number 超出了范围
这个代码使用列表 nums 来代替了重复的赋值操作,并使用 all 函数来判断所有元素是否都大于 0。在每次循环中,将 number 转换为字符串并遍历其中的每个数字。然后,将 nums 中对应数字的计数器减去 1。最后,如果所有数字的计数器都大于 0,则 number 加 1,直到有一个数字的计数器降至 0。最后输出 number - 1 是因为在最后一次循环中,number 超出了范围,因此需要将其减去 1。 可以使用贪心算法来解决这个问题。我们可以先将数字卡片按照数字大小从大到小排序,然后从 1 开始依次尝试能否拼出每一个数。
具体的算法步骤如下:
将数字卡片按照数字大小从大到小排序。
从数字 1 开始,依次尝试能否用卡片拼出每个数。如果能拼出某个数,则记录下来,并将已使用的卡片从卡片列表中移除。
直到不能再拼出更多的数为止,返回已记录下的最大数。
以下是 Python 代码实现:
python
Copy code
def max_num_from_cards(cards):
# 将数字卡片按数字从大到小排序
cards.sort(reverse=True)
# 记录已拼出的数的集合
used_nums = set()
# 尝试拼出从 1 开始的每个数
for num in range(1, 20211):
# 将当前数转化为卡片组合
num_str = str(num)
num_cards =
# 判断当前数是否可以用卡片拼出
if all(num_cards.count(i) <= cards for i in range(10)):
# 如果可以拼出当前数,则将其记录下来,并将已使用的卡片从列表中移除
used_nums.add(num)
for i in range(10):
cards -= num_cards.count(i)
else:
# 如果无法拼出当前数,则结束拼数过程
break
# 返回已记录下的最大数
return max(used_nums)
使用上述函数可以得到小蓝可以拼出的最大数,例如:
python
Copy code
cards = * 10
max_num = max_num_from_cards(cards)
print(max_num)# 输出:20210
因为小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,因此最大可以拼出的数为 20210。
页:
[1]