第二篇|小M的数组变换|豆包MarsCode AI技术刷题

41 阅读4分钟

一、问题描述

小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 aiai​ 和 ajaj​,并选择 aiai​ 的一个因子 xx,然后将 aiai​ 变为 ai/xai​/x,并将 ajaj​ 变为 aj×xaj​×x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。素因子的定义是:若 xx 能被素数 pp 整除,那么 pp 是 xx 的一个素因子。例如,1212 的素因子有 22 和 33。你的任务是判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"


测试样例

样例1:

输入:n = 4 ,a = [1, 2, 3, 4]
输出:'Yes'

样例2:

输入:n = 2 ,a = [10, 12]
输出:'No'

样例3:

输入:n = 3 ,a = [6, 9, 15]
输出:'Yes'

二、代码展示

    def solution(n: int, a: list) -> str:
    # write code heredef solution(n, a):
    def get_prime_factors(num):
        factors = set()
        i = 2
        while i * i <= num:
            if num % i:
                i += 1
            else:
                num //= i
                factors.add(i)
        if num > 1:
            factors.add(num)
        return factors

    for _ in range(n):
        prime_factors = [get_prime_factors(ai) for ai in a]
        all_factors = set().union(*prime_factors)
        if len(all_factors) > n:
            return 'No'
        for i in range(n):
            for j in range(i + 1, n):
                for factor in prime_factors[i]:
                    if factor not in prime_factors[j]:
                        new_a_i = a[i] // factor
                        new_a_j = a[j] * factor
                        if new_a_i > 0 and new_a_j > 0:
                            a[i], a[j] = new_a_i, new_a_j
                            break
    return 'Yes'
    # placeholder return

    if __name__ == '__main__':
        print(solution(4, [1, 2, 3, 4]) == "Yes")
        print(solution(2, [10, 12]) == "No")
        print(solution(3, [6, 9, 15]) == "Yes")

三、代码分析

1. 整体功能概述

这段代码定义了一个名为  solution  的函数,它接受一个整数  n  和一个整数列表  a  作为参数。函数的主要目的似乎是对列表  a  中的整数进行某种基于素因数分解的操作和判断,最终返回一个字符串  'Yes'  或  'No' ,以表示列表  a  中的元素是否满足特定条件。

2. 函数  get_prime_factors

  • 功能:这个函数用于获取一个给定整数  num  的所有素因数。
  • 实现细节:
  • 首先初始化一个空集合  factors ,用于存储找到的素因数。
  • 从  i = 2  开始,只要  i  的平方小于等于  num ,就进行循环:
  • 如果  num  不能被  i  整除,就将  i  增加  1 。
  • 如果  num  能被  i  整除,就将  num  除以  i ,并将  i  添加到  factors  集合中。
  • 循环结束后,如果  num  大于  1 ,说明还有剩余的因数,将其添加到  factors  集合中。
  • 最后返回  factors  集合,其中包含了  num  的所有素因数。

3. 函数  solution  的主体部分

  • 循环遍历:

    通过  for _ in range(n)  循环  n  次,每次迭代都会对列表  a  中的元素进行一系列操作。

  • 获取素因数列表和所有因数集合:

    在每次循环中,首先使用列表推导式  [get_prime_factors(ai) for ai in a]  获取列表  a  中每个元素的素因数集合列表  prime_factors 。

    然后使用  set().union(*prime_factors)  将所有素因数集合合并为一个包含所有不同素因数的集合  all_factors 。

  • 初步判断:

    如果  all_factors  集合中的元素个数大于  n ,就直接返回  'No' 。这意味着列表  a  中的元素的素因数种类过多,不符合某种隐含的条件。

  • 调整列表元素:

    接下来通过两层嵌套循环  for i in range(n)  和  for j in range(i + 1, n)  遍历列表  a  中的每对不同元素。 对于每对元素  a[i]  和  a[j] ,再遍历  a[i]  的素因数集合  prime_factors[i] : 如果某个素因数不在  a[j]  的素因数集合  prime_factors[j]  中,就尝试进行一种调整操作。将  a[i]  除以这个素因数得到  new_a_i ,将  a[j]  乘以这个素因数得到  new_a_j 。 如果  new_a_i  和  new_a_j  都大于  0 ,说明调整是合理的,就将  a[i]  和  a[j]  更新为  new_a_i  和  new_a_j ,并使用  break  跳出内层循环,继续下一对元素的检查。

  • 最终返回:

    如果整个循环过程没有提前返回  'No' ,就说明列表  a  中的元素经过一系列调整(如果有需要的话)后满足了某种条件,最终返回  'Yes' 。

4. 主程序部分

  • 在  if name == 'main':  语句块中,对  solution  函数进行了三次调用测试:
  • 第一次调用  solution(4, [1, 2, 3, 4])  并检查返回值是否等于  "Yes" 。
  • 第二次调用  solution(2, [10, 12])  并检查返回值是否等于  "No" 。
  • 第三次调用  solution(3, [6, 9, 15])  并检查返回值是否等于  "Yes" 。

通过这些测试调用,可以初步验证  solution  函数在不同输入情况下的正确性。总体而言,这段代码围绕着对整数列表元素的素因数分析和基于素因数的调整操作来判断列表是否满足特定条件。