力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《205.同构字符串、217. 存在重复元素、283. 移动零》。

目录

205.同构字符串

        题目描述

        解题思路

        解题代码 

​217. 存在重复元素

        题目描述

        解题思路

        解题代码

283. 移动零

        题目描述

        解题思路

        解题过程 


205.同构字符串

题目描述

给定两个字符串 s 和 t ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add"
输出:true

示例 2:

输入:s = "foo", t = "bar"
输出:false

解题思路

看到映射关系,首先想到的是字典的对应关系,所以这一题我们能够拿字典来处理。遍历s,建立与t的映射关系,以此来生成映射中的t,同样遍历t,建立与s的映射关系,生成映射中的s,比较生成的与实际的是否相等,如果都相等说明是同构字符串,返回True,否则返回False。整体的思路还是比较简单的。

解题代码 

def isIsomorphic(s: str, t: str):
    if len(s) != len(t):
        return False
    else:
        s_dic = {}
        t_dic = {}
        s_str = ""
        t_str = ""
        for i in range(0,len(s)):
            s_dic[s[i]] = t[i]
            t_dic[t[i]] = s[i]
        for i in s:
            s_str += s_dic[i]
        for j in t:
            t_str += t_dic[j]
        if s_str == t and t_str == s:
            return True
        else:
            return False

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零_第1张图片217. 存在重复元素

题目描述

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:

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

示例 2:

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

示例 3:

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

解题思路

这题放之前我肯定遍历列表用count来数了,现在第一想法就是用set转成集合,set有一个天然优势,那就是会去除重复元素,这样我们只需要比较转换前和转化后的长度就可以了,大大减少了代码量,一次通过!

解题代码

def containsDuplicate( nums):
    list_set  = list(set(nums))
    if len(list_set) == len(nums):
        return False
    else:
        return True

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零_第2张图片

283. 移动零

题目描述

 

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

解题思路

分为两步走吧,第一步找出0的索引,第二步将0与后面的数交换,及冒泡排序,这里注意要从后面的索引开始交换,这样才不影响前面列表的顺序,所有涉及到列表的倒序操作。

解题过程 

def moveZeroes(nums):
    zero_list = []
    for i in range(0,len(nums)):
        if nums[i] == 0:
            zero_list.append(i)
    zero_list = zero_list[::-1]
    for ind_p in zero_list:
        while ind_p != len(nums)-1:
            nums[ind_p],nums[ind_p+1] = nums[ind_p+1],nums[ind_p]
            ind_p +=1
    return nums

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零_第3张图片

 可惜,有一个算例超出时间了,看来时间复杂度还是太高了,需要优化自己的代码,要低于O(n^2)。上面我用到的是冒泡排序,可以更换其他的排序算法以降低时间复杂度。

def moveZeroes(nums):
    length_1 = len(nums)
    nums_tep = nums[::-1]
    for i in nums_tep:
        if i == 0:
            nums.remove(i)
    length_2 = len(nums)
    count = 0
    while count != length_1-length_2:
        nums.append(0)
        count+=1
    return nums

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零_第4张图片

 虽然通过了,但是好像复制了数组,不符合题目要求!看看其他大神的解答:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(len(nums)-1,-1,-1):    
            if nums[i]==0:
                nums.append(nums.pop(i))

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零_第5张图片

利用正序会比较麻烦,这里可以使用倒序去处理。pop弹出0,再通过append方法加到末尾,即可完成操作。

你可能感兴趣的:(蓝桥杯刷题,leetcode,算法,职场和发展,蓝桥杯,刷题)