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

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

205.同构字符串

题目描述

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

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

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

示例 1:

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

输出:true


示例 2:

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

输出:false


解题思路

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

解题代码

1. def isIsomorphic(s: str, t: str):
2. if len(s) != len(t):
3. return False
4. else:
5.         s_dic = {}
6.         t_dic = {}
7.         s_str = ""
8.         t_str = ""
9. for i in range(0,len(s)):
10.             s_dic[s[i]] = t[i]
11.             t_dic[t[i]] = s[i]
12. for i in s:
13.             s_str += s_dic[i]
14. for j in t:
15.             t_str += t_dic[j]
16. if s_str == t and t_str == s:
17. return True
18. else:
19. return False

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有一个天然优势,那就是会去除重复元素,这样我们只需要比较转换前和转化后的长度就可以了,大大减少了代码量,一次通过!

解题代码

1. def containsDuplicate( nums):
2.     list_set  = list(set(nums))
3. if len(list_set) == len(nums):
4. return False
5. else:
6. return True

283. 移动零

题目描述

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

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

示例 1:

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

输出:[1,3,12,0,0]

示例 2:

输入: nums = [0]

输出:[0]

解题思路

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

解题过程

1. def moveZeroes(nums):
2.     zero_list = []
3. for i in range(0,len(nums)):
4. if nums[i] == 0:
5.             zero_list.append(i)
6.     zero_list = zero_list[::-1]
7. for ind_p in zero_list:
8. while ind_p != len(nums)-1:
9.             nums[ind_p],nums[ind_p+1] = nums[ind_p+1],nums[ind_p]
10.             ind_p +=1
11. return nums

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

1. def moveZeroes(nums):
2.     length_1 = len(nums)
3.     nums_tep = nums[::-1]
4. for i in nums_tep:
5. if i == 0:
6.             nums.remove(i)
7.     length_2 = len(nums)
8.     count = 0
9. while count != length_1-length_2:
10.         nums.append(0)
11.         count+=1
12. return nums

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

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

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


相关文章
|
13天前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
42 2
|
4天前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4天前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
4天前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
4天前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
4天前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
|
13天前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
11 1
|
13天前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
13 0
【Leetcode刷题Python】73. 矩阵置零
|
4天前
|
算法
LeetCode第27题移除元素
这篇文章介绍了LeetCode第27题"移除元素"的解题方法,通过使用双指针技巧,有效移除数组中特定值的元素并返回新数组的长度。
|
13天前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
13 0