青训1/1105/01 数字分组求偶数和
青训1/1105/01 数字分组求偶数和
文章目录
一 问题描述
小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。
- `numbers`: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。小M需要从每个数字组中选择一个数字。
例如对于`[123, 456, 789]`,14个符合条件的数为:`147 149 158 167 169 248 257 259 268 347 349 358 367 369`。
1.1 测试样例
样例1:
输入:
numbers = [123, 456, 789]
输出:14
样例2:
输入:
numbers = [123456789]
输出:4
样例3:
输入:
numbers = [14329, 7568]
输出:10
1.2示例
def solution(numbers):
# Please write your code here
return -1
if __name__ == "__main__":
# You can add more test cases here
print(solution([123, 456, 789]) == 14)
print(solution([123456789]) == 4)
print(solution([14329, 7568]) == 10)
二 思路
2.1 思路_个人(error)
这里不用变为总数,使用异或思想,如果是偶数则为0,奇数则为1. 如果三数和结果为0,则符合条件,
关键是筛选方式:可以先两两得出选择方式,最后与其他数据进行处理。
有点像回溯,遍历所有结果。并把原本小组合结果用于下一组合。
2.2 主要思路_可实现
你的思路分析:
1. 使用异或思想判断奇偶性是个不错的想法,不过在这个问题中,直接计算各位数字之和判断是否为偶数会更直观
2. 你提到的回溯思想是对的,但我们可以使用Python的itertools.product来更简洁地实现所有可能的组合
解决方案的主要思路:
1. 对每个数字字符串,提取出其中的唯一数字作为可选项
2. 使用itertools.product生成所有可能的组合
3. 对每个组合:
- 转换为数字
- 检查是否出现过(去重)
- 判断各位数之和是否为偶数
4. 统计符合条件的组合数量
这个解决方案的优点是:
- 使用set去重,避免重复计算
- 利用Python内置的itertools.product简化组合生成
- 代码结构清晰,便于理解和维护
2.3 答案
from itertools import product
def get_digits(number):
"""从数字中获取所有可选的数字"""
# 将整数转换为字符串后再处理
return sorted(set(str(number)))
def is_sum_even(number):
"""判断数字各位之和是否为偶数"""
return sum(int(d) for d in str(number)) % 2 == 0
def solution(numbers):
# 从每个组中获取可选的数字
groups = [get_digits(num) for num in numbers]
# 使用itertools.product获取所有可能的组合
combinations = product(*groups)
# 计数符合条件的组合
count = 0
seen = set() # 用于去重
for combo in combinations:
# 将组合转换为数字
num = int(''.join(combo))
# 检查是否已经出现过这个数字
if num in seen:
continue
# 如果数字各位之和为偶数,增加计数
if is_sum_even(num):
count += 1
seen.add(num)
return count
if __name__ == "__main__":
# You can add more test cases here
print(solution([123, 456, 789]) == 14)
print(solution([123456789]) == 4)
print(solution([14329, 7568]) == 10)
三、补充知识点
3.1 笛卡尔积 combinations = product(*groups) 方法_要去重相同笛卡尔积(题目),优势:比较手写嵌套
是 Python 内置的一个函数,用于生成多个可迭代对象的笛卡尔积(Cartesian product)。简单来说,它会返回所有可能的组合方式。
例子 2*2
from itertools import product
# 假设我们有这样的输入
numbers = [12, 34]
groups = [['1', '2'], ['3', '4']]
# product(*groups) 会生成以下组合:
# ('1', '3')
# ('1', '4')
# ('2', '3')
# ('2', '4')
例子 3*3
# 对于输入 [123, 456, 789]
numbers = [123, 456, 789]
groups = [
['1', '2', '3'], # 第一组可选数字
['4', '5', '6'], # 第二组可选数字
['7', '8', '9'] # 第三组可选数字
]
# product(*groups) 会生成所有可能的三位数组合
# 比如:
# ('1', '4', '7')
# ('1', '4', '8')
# ('1', '4', '9')
# ('1', '5', '7')
# ...以此类推
优势 :自动根据数组内个数,进行笛卡尔积。如果使用手写,则需要实现进行罗列嵌套组合,不方便。如下手写嵌套
# 等效的嵌套循环(仅适用于3个组的情况)
def manual_product(groups):
results = []
for x in groups[0]:
for y in groups[1]:
for z in groups[2]:
results.append((x, y, z))
return results
3.2 num = int(‘’.join(combo)) 即用无间隔的空字符串拼接+转为整数
让我详细解释一下 num = int(''.join(combo))
这行代码的执行过程。
假设我们以输入 [123, 456, 789]
为例:
# 1. combo 是从 product(*groups) 得到的一个组合
# 例如,combo 可能是 ('1', '4', '7')
# 2. ''.join(combo) 将这个组合连接成字符串
# ''.join(('1', '4', '7')) 得到 '147'
# 3. int('147') 将字符串转换为整数
# 最终 num = 147
让我们通过一个简单的代码来展示这个过程:
python
Copy
from itertools import product
# 示例输入
numbers = [123, 456, 789]
# 1. 获取每个数字的可选数字集合
groups = [sorted(set(str(num))) for num in numbers]
print("各组可选数字:")
print(groups) # [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
# 2. 获取所有组合中的前几个作为示例
combinations = product(*groups)
print("\n组合示例:")
for combo in list(combinations)[:5]: # 只显示前5个组合
# 展示转换过程
print(f"当前组合 combo: {combo}")
print(f"''.join(combo): {''.join(combo)}")
print(f"int(''.join(combo)): {int(''.join(combo))}")
print("---")
注意
输入是整数,而非字符串
原文地址:https://blog.csdn.net/qq_40266376/article/details/143508013
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!