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 <= 10
4
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 * 10
4
0 <= nums[i] <= 10
5
选项代码:
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]))