每日一练 — 2021.12.08

这篇博客介绍了三个编程问题的解决方案:1. 爬楼梯问题,通过动态规划找到到达楼顶的不同方法;2. 解码方法,计算给定数字字符串的不同解码方式;3. 搜索旋转排序数组,利用二分查找法在数组中寻找目标值。每个问题都提供了详细的程序代码和示例运行结果。
摘要由CSDN通过智能技术生成


一、爬楼梯

1,程序简介

  • 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

  • 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。
示例 1:
  • 输入: 2
  • 输出: 2
  • 解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶
示例 2:
  • 输入: 3
  • 输出: 3
  • 解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Wed Dec  8 07:27:51 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
    def climbStairs(self, n):
        if n <= 1:
            return 1
        dp = [1]*2
        for i in range(2, n+1):
            dp[1], dp[0] = dp[1]+dp[0], dp[1]
        return dp[1]
#%%
s = Solution()
print(s.climbStairs(2))
        

3,运行结果

在这里插入图片描述

二、解码方法

1,程序简介

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :
  • ‘A’ -> 1’B’ -> 2…‘Z’ -> 26
  • 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:
  • “AAJF” ,将消息分组为 (1 1 10 6)
  • “KJF” ,将消息分组为 (11 10 6)
  • 注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。
  • 给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。
  • 题目数据保证答案肯定是一个 32 位 的整数。
示例 1:
  • 输入:s = “12”
  • 输出:2
  • 解释:它可以解码为 “AB”(1 2)或者 “L”(12)。
示例 2:
  • 输入:s = “226”
  • 输出:3
  • 解释:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。
示例 3:
  • 输入:s = “0”
  • 输出:0
  • 解释:没有字符映射到以 0 开头的数字。含有 0 的有效映射是 ‘J’ -> “10” 和 ‘T’-> “20” 。由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
示例 4:
  • 输入:s = “06”
  • 输出:0
  • 解释:“06” 不能映射到 “F” ,因为字符串含有前导 0(“6” 和 “06” 在映射中并不等价)。
提示:
  • 1 <= s.length <= 100
  • s 只包含数字,并且可能包含前导零。

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Wed Dec  8 07:28:20 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
    def numDecodings(self, s):
        ls = len(s)
        if ls == 0:
            return 0
        dp = [0]*ls
        for index in range(ls):
            if index >= 1 and int(s[index-1:index+1]) < 27 and int(s[index-1:index+1]) >= 10:
                if index == 1:
                    dp[index]=1
                else:
                    dp[index] += dp[index-2]
            if int(s[index]) != 0:
                if index ==0:
                    dp[index]=1
                else:
                    dp[index] += dp[index-1]
        return dp[ls-1]
#%%
s = Solution()
print(s.numDecodings(s="12"))#2

3,运行结果

在这里插入图片描述

三、搜索旋转排序数组 ||

1,程序简介

  • 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。
  • 在传递给函数之前,nums 在预先未知的某个下k(0<=k<nums.length)上进行了 旋转 ,使数组变为[nums[k],nums[k+1], …, nums[n-1], nums[0], nums[1], …,nums[k-1]](下标 从 0 开始计数)。
  • 例如,[0,1,2,4,4,4,5,6,6,7] 在下标 5处经旋转后可能变为[4,5,6,6,7,0,1,2,4,4] 。
  • 给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums中存在这个目标值 target ,则返回 true ,否则返回 false 。
示例 1:
  • 输入:nums = [2,5,6,0,0,1,2], target = 0
  • 输出:true
示例 2:
  • 输入:nums = [2,5,6,0,0,1,2], target = 3
  • 输出:false
提示:
  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -104 <= target <= 104
进阶:
  1. 这是 搜索旋转排序数组 的延伸题目,本题中的 nums 可能包含重复元素。
  2. 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Wed Dec  8 07:28:31 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
    def search(self, nums, target):
        def get(start, end):
            if start > end:
                return False
            mid = (start + end)/2
            mid = int(mid)
            while mid < end and nums[mid+1] == nums[mid]:
                mid += 1
            while start < mid and nums[start+1] == nums[start]:
                start += 1
            if nums[mid] == target:
                return True
            elif mid ==end:
                return get(start, mid-1)
            elif start == mid:
                return get(mid+1, end)
            elif nums[mid] >= nums[start]:
                if target >= nums[start] and target < nums[mid]:
                    return get(start, mid-1)
                else:
                    return get(mid+1, end)
            elif nums[mid] <= nums[end]:
                if target > nums[mid] and target <= nums[end]:
                    return get(mid+1, end)
                else:
                    return get(start, mid-1)
        return get(0, len(nums)-1)
#%%
s=Solution()
print(s.search(nums=[2,5,6,0,0,1,2], target=0))#true
print(s.search(nums=[2,5,6,0,0,1,2], target=3))#false

3,运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值