Python|每日一练|数组|哈希表|字符串|双指针|贪心|单选记录:缺失的第一个正数|翻转字符串里的单词|跳跃游戏

1、缺失的第一个正数(数组,哈希表)

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?

示例 1

输入:nums = [1,2,0]
输出:3

示例 2

输入:nums = [3,4,-1,1]
输出:2

示例 3

输入:nums = [7,8,9,11,12]
输出:1

 

提示:

  • 0 <= nums.length <= 300
  • -231 <= nums[i] <= 231 - 1

以下程序实现了这一功能,请你填补空白处内容:

class Solution(object):
	def firstMissingPositive(self, nums):
		ls = len(nums)
		index = 0
		while index < ls:
			if nums[index] <= 0 or nums[index] > ls or nums[nums[index] - 1] == nums[index]:
				index += 1
			else:
				pos = nums[index] - 1
				nums[index], nums[pos] = nums[pos], nums[index]
		res = 0
		_________________________;
		return res + 1
# %%
s = Solution()
print(s.firstMissingPositive(nums = [1,2,0]))

选项代码:

class Solution(object):
    def firstMissingPositive(self, nums):
        ls = len(nums)
        index = 0
        while index < ls:
            if nums[index] <= 0 or nums[index] > ls or nums[nums[index] - 1] == nums[index]:
                index += 1
            else:
                pos = nums[index] - 1
                nums[index], nums[pos] = nums[pos], nums[index]
        res = 0
        while res < ls and nums[res] == res + 1:
            res += 1
        return res + 1


# %%
s = Solution()
print(s.firstMissingPositive(nums=[1, 2, 0]))

2、翻转字符串里的单词(双指针,字符串)

给你一个字符串 s ,逐个翻转字符串中的所有 单词 

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。

说明:

  • 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
  • 翻转后单词间应当仅用一个空格分隔。
  • 翻转后的字符串中不应包含额外的空格。

 

示例 1

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2

输入:s = "  hello world  "
输出:"world hello"
解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。

示例 3

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,将翻转后单词间的空格减少到只含一个。

示例 4

输入:s = "  Bob    Loves  Alice   "
输出:"Alice Loves Bob"

示例 5

输入:s = "Alice does not even like bob"
输出:"bob like even not does Alice"

 

提示:

  • 1 <= s.length <= 104
  • s 包含英文大小写字母、数字和空格 ' '
  • s  至少存在一个 单词

 

进阶:

  • 请尝试使用 O(1) 额外空间复杂度的原地解法。

选项代码:

class Solution:
    def reverseWords(self, s: str) -> str:
        str_list = s.split()
        s1 = ""
        for n, i in enumerate(str_list[::-1]):
            if n == len(str_list) - 1:
                s1 = s1 + i
            else:
                s1 = s1 + i + " "
        return s1
# %%
if __name__ == "__main__":
    str = input()
    s = Solution()
    print(s.reverseWords(str))

3、跳跃游戏(贪心,数组)

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

 

示例 1

输入:nums = [2,3,1,1,4]

输出:true

解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1  3 步到达最后一个下标。

示例 2

输入:nums = [3,2,1,0,4]

输出:false

解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0  所以永远不可能到达最后一个下标。

 

提示:

  • 1 <= nums.length <= 3 * 104
  • 0 <= nums[i] <= 105

选项代码:

class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        length = len(nums)
        begin = length - 1
        for i in reversed(range(length - 1)):
            if i + nums[i] >= begin:
                begin = i
        return not begin
# %%
s = Solution()
print(s.canJump(nums = [2,3,1,1,4]))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

打酱油的工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值