本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《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
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
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
可惜,有一个算例超出时间了,看来时间复杂度还是太高了,需要优化自己的代码,要低于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
虽然通过了,但是好像复制了数组,不符合题目要求!看看其他大神的解答:
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))
利用正序会比较麻烦,这里可以使用倒序去处理。pop弹出0,再通过append方法加到末尾,即可完成操作。