方法总结4|豆包MarsCode AI刷题

81 阅读3分钟

1找单独的数

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。需要找到那个只出现一次的数字。

输入输出格式

  • 输入:一个整数数组cards,表示每位同学卡片上的数字。
  • 输出:一个整数,表示那个只出现一次的数字。

算法设计

由于除了一个数字外,其他数字都出现了两次,我们可以利用异或运算的性质来解决这个问题。异或运算满足以下性质:

  1. 任何数和0异或结果仍然是原数。
  2. 任何数和自身异或结果是0。
  3. 异或运算满足交换律和结合律。

基于这些性质,我们可以对数组中的所有数字进行异或运算。成对出现的数字在异或运算中会相互抵消,最终只剩下那个只出现一次的数字。

时间复杂度

该算法的时间复杂度为O(n),其中n是班级的人数,因为我们需要遍历一次数组中的所有元素。

空间复杂度

该算法的空间复杂度为O(1),因为我们只使用了一个额外的变量unique来存储异或的结果,不依赖于输入数组的大小。

def solution(inp):
    unique = 0
    for card in inp:
        unique ^= card
    return unique

97最大乘积区间问题

def solution(n, data):
    max_product = -1
    result = [-1, -1]
    
    for i in range(n):
        current_product = 1
        for j in range(i, n):
            # 计算当前区间的乘积
            current_product *= data[j]
            
            # 如果遇到0,跳过当前区间
            if data[j] == 0:
                break
            
            # 更新最大乘积及其对应的区间
            if current_product > max_product:
                max_product = current_product
                result = [i + 1, j + 1]
            elif current_product == max_product:
                # 优先选择起始位置更小的区间
                if i + 1 < result[0]:
                    result = [i + 1, j + 1]
                # 如果起始位置相同,选择结束位置更小的区间
                elif i + 1 == result[0] and j + 1 < result[1]:
                    result = [i + 1, j + 1]
    
    return result

问题描述

给定一个长度为n的数组,数组中的元素来自集合[0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。需要找到数组中一段连续区间,使得该区间内所有数的乘积最大,并输出这个区间的起始位置x和结束位置y(x ≤ y)。如果存在多个区间乘积相同,优先选择x更小的区间;如果x相同,选择y更小的区间。

输入输出格式

  • 输入:两个整数n和数组data,其中n是数组的长度,data是数组元素。
  • 输出:一个包含两个整数的列表result,表示最大乘积区间的起始和结束位置。

算法设计

我们可以使用一个双层循环来解决这个问题。外层循环遍历数组,内层循环从外层循环的当前位置开始,计算以当前位置为起始的所有可能区间的乘积。如果遇到0,则跳出内层循环,因为包含0的区间乘积为0,不是我们要找的区间。在计算过程中,我们需要维护一个全局的最大乘积和对应的区间位置。