1.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n), 可知至少存在一个重复的整数,假设只有一个重复的整数,请找出这个重复的数
def find_duplicate(nums):
count = {} # 创建一个空字典用于存储每个数字的出现次数
for num in nums:
if num in count:
count[num] += 1
else:
count[num] = 1
for key, value in count.items():
if value > 1: # 检查哪个数字的计数器大于1
return key # 如果找到这样的数字,则返回它
return "No duplicate found" # 如果没有找到这样的数字,则返回消息
# 测试代码
nums = [1, 2, 3, 8, 5, 6, 7, 8, 9]
print(find_duplicate(nums))
这个问题可以通过建立一个字典来解决,字典的键是数组中的数字,值是数字出现的次数。由于我们知道数组中至少有一个重复的整数,所以我们可以通过遍历字典来找到出现次数大于1的数字,即重复的数字。
测试:
2.找出10000以内能被5或6整除,但不能被两者同时整除的数(函数)
def find_numbers(n):
result = []
for i in range(1, n+1):
if (i % 5 == 0 or i % 6 == 0) and not (i % 5 == 0 and i % 6 == 0):
result.append(i)
return result
# 测试代码
print(find_numbers(100))
定义了一个名为find_numbers
的函数,它接受一个参数n
,表示我们要查找的数字的上限。然后,我们使用一个for
循环来遍历从1到n
的所有数字。对于每一个数字,我们检查它是否可以被5或6整除,但是不能同时被两者整除。如果是这样,我们就把这个数字添加到结果列表中。最后,函数返回结果列表。
测试:
3.写一个方法,计算列表所有偶数下标元素的和(注意返回值)
def sum_even_indexed_elements(lst):
return sum(lst[i] for i in range(len(lst)) if i % 2 == 0)
# 测试代码
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("偶数下标元素的和:", sum_even_indexed_elements(my_list))
定义了一个名为 sum_even_indexed_elements
的函数,它接受一个列表 lst
作为参数。函数内部使用列表推导式来迭代列表中的每个元素,并且只选择那些下标为偶数的元素(即索引 i
满足 i % 2 == 0
)。然后,使用 sum
函数来计算这些元素的和,并返回结果。
测试:
4.某个人进入如下一个棋盘中,要求从左上角开始走, 最后从右下角出来(要求只能前进,不能后退), 问题:共有多少种走法?
利用算法中学过的动态规划法的思想来解决这个问题
动态规划是一种解决复杂问题的有效策略,它将问题分解为更小的子问题,并存储这些子问题的解,以便在解决大问题时可以重用它们。
对于这个特定的棋盘问题,我们可以定义一个二维数组 dp
,其中 dp[i][j]
表示从左上角出发到达棋盘上第 i
行第 j
列的位置时有多少种走法。状态转移方程为:dp[i][j] = dp[i-1][j] + dp[i][j-1]
,其中 dp[i-1][j]
表示从上方走到当前位置的走法数,dp[i][j-1]
表示从左侧走到当前位置的走法数。最终,dp[x-1][y-1]
即为从左上角走到右下角的走法数。
def unique_paths(x, y):
dp = [[0] * y for _ in range(x)]
dp[0][0] = 1
for i in range(x):
for j in range(y):
if i > 0:
dp[i][j] += dp[i-1][j]
if j > 0:
dp[i][j] += dp[i][j-1]
return dp[x-1][y-1]
#测试
unique_paths(5, 8)