本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列》。
目录
645. 错误的集合
题目描述
解题思路
解题过程
657. 机器人能否返回原点
题目描述
解题思路
解题代码
674. 最长连续递增序列
题目描述
解题思路
解题代码
645. 错误的集合
题目描述
集合
s
包含从1
到n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组
nums
代表了集合S
发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4] 输出:[2,3]示例 2:
输入:nums = [1,1] 输出:[1,2]
解题思路
采用暴力循环的方式,数列表中每个元素出现的次数,如果次数是2说明是重复的元素,再根据列表的长度和最大值判断需要添加的元素是哪一个。
解题过程
def findErrorNums(nums):
max_num = max(nums)
result = []
num_dic = {}
if nums == [1,1]:
return [1,2]
if nums.count(max_num) == 2 and max_num != 1:
result.append(max_num)
for i in range(1,max_num):
if i not in nums:
result.append(i)
return result
if len(nums) == max_num:
for i in range(1,max_num):
num_dic[nums.count(i)] = i
if i not in nums:
result.append(i)
result.append(num_dic[2])
result = result[::-1]
else:
for i in range(1, max_num):
num_dic[nums.count(i)] = i
result.append(num_dic[2])
result.append(max_num+1)
return result
超出时间限制,暴力循环最怕出现这种情况,整体思路需要换一下 。先对列表排序,再用指针去循环寻找重复的元素。之后再用遍历列表的方式去寻找不在的元素。
def findErrorNums(nums):
max_num = max(nums)
result = []
l_p = 0
nums.sort()
if nums.count(max_num) == 2:
if max_num == 1:
return [1,2]
if max_num == 2:
return [2,1]
else:
result.append(max_num)
for i in range(1,max_num):
if i not in nums:
result.append(i)
return result
while True:
if nums[l_p] == nums[l_p+1]:
result.append(nums[l_p])
break
l_p += 1
if max_num != len(nums):
result.append(max_num+1)
else:
for i in range(1,max_num):
if i not in nums:
result.append(i)
break
return result
657. 机器人能否返回原点
题目描述
在二维平面上,有一个机器人从原点
(0, 0)
开始。给出它的移动顺序,判断这个机器人在完成移动后是否在(0, 0)
处结束。移动顺序由字符串
moves
表示。字符move[i]
表示其第i
次移动。机器人的有效动作有R
(右),L
(左),U
(上)和D
(下)。如果机器人在完成所有动作后返回原点,则返回
true
。否则,返回false
。注意:机器人“面朝”的方向无关紧要。
“R”
将始终使机器人向右移动一次,“L”
将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。示例 1:
输入: moves = "UD" 输出: true 解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。示例 2:
输入: moves = "LL" 输出: false 解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。
解题思路
直接数各个字符串出现的次数就可以了,如果对应的相等返回True,否则返回False。
解题代码
def judgeCircle(moves:str):
if moves.count("U") == moves.count("D") and moves.count("L") == moves.count("R"):
return True
else:
return False
674. 最长连续递增序列
题目描述
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标
l
和r
(l < r
)确定,如果对于每个l <= i < r
,都有nums[i] < nums[i + 1]
,那么子序列[nums[l], nums[l + 1], ..., nums[r - 1], nums[r]]
就是连续递增子序列。示例 1:
输入:nums = [1,3,5,4,7] 输出:3 解释:最长连续递增序列是 [1,3,5], 长度为3。 尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。示例 2:
输入:nums = [2,2,2,2,2] 输出:1 解释:最长连续递增序列是 [2], 长度为1。
解题思路
涉及到列表内部的比较用指针会比较方便,这题很明显是双层循环,所有外面用一个for循环,内幕用一个指针去比较操作,while循环的边界要注意划分。
解题代码
def findLengthOfLCIS(nums):
count = 1
result = []
for i in range(len(nums)):
count = 1
l_p = i
while l_p+2 <= len(nums):
if nums[l_p] < nums[l_p + 1]:
count += 1
l_p += 1
else:
break
result.append(count)
return max(result)