每日一练 — 2022.01.24


一,按要求补齐数组

1,程序简介

给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。

示例 1:

  • 输入: nums =
    [1,3]
    , n =
    6
  • 输出: 1
  • 解释:
    根据 nums 里现有的组合
    [1], [3], [1,3]
    ,可以得出
    1, 3, 4
    现在如果我们将
    2
    添加到 nums 中, 组合变为:
    [1], [2], [3], [1,3], [2,3], [1,2,3]
    其和可以表示数字
    1, 2, 3, 4, 5, 6
    ,能够覆盖
    [1, 6]
    区间里所有的数。
    所以我们最少需要添加一个数字。

示例 2:

  • 输入: nums =
    [1,5,10]
    , n =
    20
  • 输出: 2
  • 解释: 我们需要添加
    [2, 4]

示例 3:

  • 输入: nums =
    [1,2,2]
    , n =
    5
  • 输出: 0

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Mon Jan 24 20:29:28 2022
Function: 按要求补齐数组
@author: 小梁aixj
"""
class Solution:
    def minPatches(self, nums: [int], n: int) -> int:
        count = 0
        miss = 1
        idx = 0
        while miss <= n:
            if idx < len(nums) and nums[idx] <= miss:
                miss += nums[idx]
                idx += 1
            else:
                count += 1
                miss += miss
        return count
s = Solution()
print(s.minPatches(nums = [1,3], n = 6))

3,运行结果

在这里插入图片描述

二,单词接龙 II

1,程序简介

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 这样的单词序列,并满足:

  • 每对相邻的单词之间仅有单个字母不同。
  • 转换过程中的每个单词 si(1 <= i <= k)必须是字典 wordList 中的单词。注意beginWord 不必是字典 wordList 中的单词。
  • sk == endWord

给你两个单词 beginWord 和 endWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWord 到 endWord 的 最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [beginWord, s1, s2, …, sk] 的形式返回。

示例 1:

  • 输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
  • 输出:[[“hit”,“hot”,“dot”,“dog”,“cog”],[“hit”,“hot”,“lot”,“log”,“cog”]]
  • 解释:存在 2 种最短的转换序列:
    “hit” -> “hot” -> “dot” -> “dog” -> “cog”
    “hit” -> “hot” -> “lot” -> “log” -> “cog”

示例 2:

  • 输入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”]
  • 输出:[]
  • 解释:endWord “cog” 不在字典 wordList 中,所以不存在符合要求的转换序列。

提示:

  • 1 <= beginWord.length <= 7
  • endWord.length == beginWord.length
  • 1 <= wordList.length <= 5000
  • wordList[i].length == beginWord.length
  • beginWord、endWord 和 wordList[i] 由小写英文字母组成
  • beginWord != endWord
  • wordList 中的所有单词 互不相同

2,程序代码

"""
Created on Mon Jan 24 20:29:46 2022
Function: 单词接龙 II
@author: 小梁aixj
"""
class Solution:
    def findLadders(self, beginWord: str, endWord: str, wordList: [str]) -> [str]:
        import collections
        ans = []
        steps = float("inf")
        if not beginWord or not endWord or not wordList or endWord not in wordList:
            return []
        word_dict = collections.defaultdict(list)
        L = len(beginWord)
        for word in wordList:
            for i in range(L):
                word_dict[word[:i] + "*" + word[i+1:]].append(word)
        queue = [[beginWord]]
        cost = {beginWord : 0}
        while queue:
            words_list= queue.pop(0)
            cur_word = words_list[-1]
            if cur_word == endWord:
                ans.append(words_list[:])
            else:
                for i in range(L):
                    intermediate_word = cur_word[:i] + "*" + cur_word[i+1:]
                    for word in word_dict[intermediate_word]:
                        w_l_temp = words_list[:]
                        if word not in cost or cost[word] >= cost[cur_word] + 1:
                            cost[word] = cost[cur_word] + 1
                            w_l_temp.append(word)
                            queue.append(w_l_temp[:])
        return ans
#%%
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log","cog"]
s = Solution()
print(s.findLadders(beginWord, endWord, wordList))

3,运行结果

在这里插入图片描述

三,基本计算器

1,程序简介

  • 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

示例 1:

  • 输入:s = “1 + 1”
  • 输出:2

示例 2:

  • 输入:s = " 2-1 + 2 "
  • 输出:3

示例 3:

  • 输入:s = “(1+(4+5+2)-3)+(6+8)”
  • 输出:23

提示:

  • 1 < = s . l e n g t h < = 3 ∗ 1 0 5 1 <= s.length <= 3 * 10^5 1<=s.length<=3105
  • KaTeX parse error: Double superscript at position 27: …-'、'('、')'、和 ' '̲ 组成
  • s 表 示 一 个 有 效 的 表 达 式 s 表示一个有效的表达式 s

2,程序代码

"""
Created on Mon Jan 24 20:29:02 2022
Function: 基本计算器
@author: 小梁aixj
"""
class Solution:
    def calculate(self, s: str) -> int:
        s = s.replace(" ", "")
        n = len(s)
        sign = 1
        stack = [sign]
        i = sumS = 0
        while i < n:
            if s[i] == "(":
                stack.append(sign)
                i += 1
            elif s[i] == ")":
                stack.pop()
                i += 1
            elif s[i] == "+":
                sign = stack[-1]
                i += 1
            elif s[i] == "-":
                sign = -stack[-1]
                i += 1
            else:
                num = 0
                while i < n and s[i].isdigit():
                    num = num * 10 + int(s[i])
                    i += 1
                sumS += sign * num
        return sumS
#%%
s = Solution()
print(s.calculate(s = "1 + 1"))

3,运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梁辰兴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值