力扣刷题记录——344.反转字符串、345.反转字符串中的元音、349.两个数组的交集

简介: 力扣刷题记录——344.反转字符串、345.反转字符串中的元音、349.两个数组的交集

344.反转字符串

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须 原地 修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"] 示例 2: 输入:s = ["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]

解题思路

这和之前遇到的有一个题目很像,所以我的相法就是倒序处理,用pop弹出,用append添加到列表的末尾,这样没有额外的引入空间。

解题代码

1. def reverseString(s):
2.     for i in range(len(s)-1,-1,-1):
3.         s.append(s.pop(i))

345.反转字符串中的元音

题目描述

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。 元音字母包括 'a' 'e' 'i' 'o' 'u' ,且可能以大小写两种形式出现不止一次。 示例 1: 输入:s = "hello" 输出:"holle" 示例 2: 输入:s = "leetcode" 输出:"leotcede"

解题思路

首先的思路是先将元音和其他元素分开,分开的时候要记录一下元音的索引,将元音反转之后按照索引再插回s中,注意当判断是元音字母时,要在s里面删除该元素,为后面的插入留出位置。

解题过程

1. def reverseVowels(s):
2.     index_list = []
3.     aeiou_list = ['a','e','i','o','u',"A","E","I","O","U"]
4.     temp_list = []
5.     s_list = [i for i in s]
6. for i in range(0,len(s)):
7. if s[i] in aeiou_list:
8.             s_list.remove(s[i])
9.             index_list.append(i)
10.             temp_list.append(s[i])
11.     temp_list = temp_list[::-1]
12. for i in range(0,len(index_list)):
13.         s_list.insert(index_list[i],temp_list[i])
14.     s = "".join(s_list)
15. return s

可惜了,最后一个算例超出了时间限制,切换一下思路,能不能用双指针来处理呢?定义两个指针,left和right,从左到右和从右到左遍历整个列表,当所指的都是元音字母的时候相互交换,直到两个指针相遇,结束操作。注意退出while循环的时,判断条件是left<right,不是两个不相等,因为不相等之后还会执行+1或-1操作,导致依然会再次进入循环中,导致索引报错!

1. def reverseVowels(s):
2.     aeiou_list = ['a','e','i','o','u',"A","E","I","O","U"]
3.     s_list = [i for i in s]
4.     left_p = 0
5.     right_p = len(s)-1
6. while left_p < right_p:
7. if s_list[left_p] in aeiou_list and s_list[right_p] in aeiou_list:
8.             s_list[left_p],s_list[right_p] = s_list[right_p],s_list[left_p]
9.             left_p +=1
10.             right_p -=1
11. elif s_list[left_p] in aeiou_list and s_list[right_p] not in aeiou_list:
12.             right_p -= 1
13. elif s_list[left_p] not in aeiou_list and s_list[right_p] in aeiou_list:
14.             left_p += 1
15. else:
16.             left_p +=1
17.             right_p -=1
18.     s = "".join(s_list)
19. return s

349.两个数组的交集

题目描述

给定两个数组 nums1 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的

解题思路

这题还是很简单的,直接用集合就可以进行处理了,将num_1,num_2转化为集合,求一个交集,再将结果转化为列表就得出了最终的答案。

解题代码

1. def intersection(nums1, nums2):
2. return list(set(nums1)&set(nums2))


相关文章
|
4天前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
5天前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
5天前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
4天前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
4天前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
4天前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
4天前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
4天前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
4天前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)