自学内容网 自学内容网

青训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)!