1找单独的数
问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。需要找到那个只出现一次的数字。
输入输出格式
- 输入:一个整数数组
cards,表示每位同学卡片上的数字。 - 输出:一个整数,表示那个只出现一次的数字。
算法设计
由于除了一个数字外,其他数字都出现了两次,我们可以利用异或运算的性质来解决这个问题。异或运算满足以下性质:
- 任何数和0异或结果仍然是原数。
- 任何数和自身异或结果是0。
- 异或运算满足交换律和结合律。
基于这些性质,我们可以对数组中的所有数字进行异或运算。成对出现的数字在异或运算中会相互抵消,最终只剩下那个只出现一次的数字。
时间复杂度
该算法的时间复杂度为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,不是我们要找的区间。在计算过程中,我们需要维护一个全局的最大乘积和对应的区间位置。