力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——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 和 rl < 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)

猜你喜欢

转载自blog.csdn.net/weixin_63866037/article/details/128759313