LeetCode75学习计划-数组/字符串
感觉自己的算法太过于薄弱了,正好在 LeetCode 上发现了 LeetCode 75 学习计划,准备画一些时间把这些题目看一下,记录一下解题思路。
算法解题思路很多会借鉴于题解区,如果侵权请联系删除。
本章节知识点为数组/字符串。
交替合并字符串
题目标签:
- 双指针
- 字符串
题目难度: Easy
题目描述:
给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
解题思路: 循环交替合并即可
代码实现:
1 | func MergeAlternately(word1 string, word2 string) string { |
字符串的最大公因子
题目标签:
- 数学
- 字符串
题目难度: Easy
题目描述:
对于字符串 s 和 t,只有在 s = t + ... + t(t 自身连接 1 次或多次) 时,我们才认定 “t 能除尽 s”。
给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。
示例:
输入:str1 = “ABCABC”, str2 = “ABC”
输出:”ABC”
解题思路:
- 公因子肯定是字符串的一个前缀子串
- 从大到小求公约数,然后判断该字符串是否是公因子
代码实现:
1 | func gcdOfString(str1, str2 string) string { |
拥有最多糖果的孩子
题目标签:
- 数组
题目难度: Easy
题目描述:
给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。
对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。
解题思路:
- 先求出数组中的最大值,即拥有糖果最多的孩子的糖果数
X - 循环数组,对每一个元素加上额外的糖果数,判断是否不小于
X
代码实现:
1 | func kidsWithCandies(candies []int, extraCandies int) []bool { |
种花问题
题目标签:
- 数组
- 贪心
题目难度: Easy
题目描述:
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。
解题思路:
- 当花坛可种花的位置大于等于
n,则可以实现 - 假设
i与j位置已经种了花,那么[i+2, j-2]区域是可以种花的。 [i+2, j-2]之间的位置数量为j - i - 3,我们假定其为m, 假设m是奇数,可以种植的位置数为m+1 / 2,假设是偶数也可以使用该公式,因为偶数+1并不会影响结果。
代码实现:
1 | func canPlaceFlowers(flowerbed []int, n int) bool { |
反转字符串中的元音字母
题目标签:
- 双指针
- 字符串
题目难度: Easy
题目描述:
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次。
解题思路:
- 双指针查找元音、交换位置,有点类似于快排找中值的操作
代码实现:
1 | func ReverseVowels(s string) string { |
反转字符串中的单词
题目标签:
- 双指针
- 字符串
题目难度: Medium
题目描述:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
解题思路:
- 字符串切割 -> 倒序 -> 合并为字符串
代码实现:
1 | func reverseWords(s string) string { |
除自身以外数组的乘积
题目标签:
- 数组
- 前缀和
题目难度: Medium
题目描述:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums 之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
解题思路:
- 分别计算每个元素左右两侧的乘积,然后相乘就是要求的值
代码实现:
1 | func productExceptSelf(nums []int) []int { |
递增的三元子序列
题目标签:
- 数组
- 贪心
题目难度: Medium
题目描述:
给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。
解题思路:
- 采用贪心算法,我们维护两个值
first和second,始终保持first为最小值且second大于first - 循环元素,如果大于
second则找到了满足要求的结果,如果小于second但是大于first则更新second的值为该元素,否则更新first的值为该元素。 - 贪心算法只保证了我们最后的答案是正确的,即是否有满足要求的数据,但是
first, second, num三个的值并不一定是满足要求的数据的值。比如传入数据[5, 4, 3, 8, 2, 9],我们得到的答案是true, 然而我们的first是2,second是8, 最后返回true的时候的num是9,这几个元素并不是我们的结果数据。
代码实现:
1 | func increasingTriplet(nums []int) bool { |
压缩字符串
题目标签:
- 双指针
- 字符串
题目难度: Medium
题目描述:
给你一个字符数组 chars ,请使用下述算法压缩:
从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :
如果这一组长度为 1 ,则将字符追加到 s 中。
否则,需要向 s 追加字符,后跟这一组的长度。
压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。
请在 修改完输入数组后 ,返回该数组的新长度。
你必须设计并实现一个只使用常量额外空间的算法来解决此问题。
解题思路:
- 通过三指针的形式来实现
- 循环读取
chars, 读指针read指向读取的元素,写指针write指向该写入内容的位置, 还有一个left指针指向当前重复字符的最左边的一个的位置。 - 当读指针读到最后一个元素,或者读指针指向的元素与下一个元素不同了,就意味着当前的重复字符已经读取完了,读指针指向的元素就是这个字符,
read - left + 1就是这个字符出现的数量。然后我们在写指针的位置写入字符和长度,更新指针的位置即可。 - 对于大于
10的数字需要额外拆分。 - 因为是读取
chars后再写入chars,所以没有占用额外的内存空间。
代码实现:
1 | func Compress(chars []byte) int { |
LeetCode75学习计划-数组/字符串
https://zhaolei-hu.github.io/2023/07/05/LeetCode75学习计划-数组-字符串/