力扣刷题记录——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方法加到末尾,即可完成操作。


相关文章
|
23天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
32 1
|
30天前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
30 0
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
11 1
|
16天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
30 1
|
30天前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
23 9
|
30天前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
15 0
|
30天前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
27 0
|
30天前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
17 0
|
30天前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
19 0
|
30天前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
14 0