645. 错误的集合
题目描述
集合
s
包含从1
到n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组
nums
代表了集合S
发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:
输入:nums = [1,1]
输出:[1,2]
解题思路
采用暴力循环的方式,数列表中每个元素出现的次数,如果次数是2说明是重复的元素,再根据列表的长度和最大值判断需要添加的元素是哪一个。
解题过程
1. def findErrorNums(nums): 2. max_num = max(nums) 3. result = [] 4. num_dic = {} 5. if nums == [1,1]: 6. return [1,2] 7. if nums.count(max_num) == 2 and max_num != 1: 8. result.append(max_num) 9. for i in range(1,max_num): 10. if i not in nums: 11. result.append(i) 12. return result 13. if len(nums) == max_num: 14. for i in range(1,max_num): 15. num_dic[nums.count(i)] = i 16. if i not in nums: 17. result.append(i) 18. result.append(num_dic[2]) 19. result = result[::-1] 20. 21. else: 22. for i in range(1, max_num): 23. num_dic[nums.count(i)] = i 24. result.append(num_dic[2]) 25. result.append(max_num+1) 26. return result
超出时间限制,暴力循环最怕出现这种情况,整体思路需要换一下 。先对列表排序,再用指针去循环寻找重复的元素。之后再用遍历列表的方式去寻找不在的元素。
1. def findErrorNums(nums): 2. max_num = max(nums) 3. result = [] 4. l_p = 0 5. nums.sort() 6. if nums.count(max_num) == 2: 7. if max_num == 1: 8. return [1,2] 9. if max_num == 2: 10. return [2,1] 11. else: 12. result.append(max_num) 13. for i in range(1,max_num): 14. if i not in nums: 15. result.append(i) 16. return result 17. while True: 18. if nums[l_p] == nums[l_p+1]: 19. result.append(nums[l_p]) 20. break 21. l_p += 1 22. if max_num != len(nums): 23. result.append(max_num+1) 24. else: 25. for i in range(1,max_num): 26. if i not in nums: 27. result.append(i) 28. break 29. 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。
解题代码
1. def judgeCircle(moves:str): 2. if moves.count("U") == moves.count("D") and moves.count("L") == moves.count("R"): 3. return True 4. else: 5. 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循环的边界要注意划分。
解题代码
1. def findLengthOfLCIS(nums): 2. count = 1 3. result = [] 4. for i in range(len(nums)): 5. count = 1 6. l_p = i 7. while l_p+2 <= len(nums): 8. if nums[l_p] < nums[l_p + 1]: 9. count += 1 10. l_p += 1 11. else: 12. break 13. result.append(count) 14. return max(result)