python实战之算法题

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)
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值