345. 反转字符串中的元音字母 Reverse Vowels Of A String
给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'
、'e'
、'i'
、'o'
、'u'
,且可能以大小写两种形式出现。
示例 1:
输入:s = "hello"
输出:"holle"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
提示:
1 <= s.length <= 3 * 10^5
s
由 可打印的 ASCII 字符组成
代码1:双指针交换
package main import ( "fmt" "strings" ) func reverseVowels(s string) string { vowels := "aeiouAEIOU" // 将字符串转换为 byte 数组,方便交换字母 str := []byte(s) left, right := 0, len(str)-1 for left < right { // 左指针找到第一个元音字母 for left < right && !strings.ContainsAny(vowels, string(str[left])) { left++ } // 右指针找到第一个元音字母 for left < right && !strings.ContainsAny(vowels, string(str[right])) { right-- } // 交换左指针和右指针指向的字母 str[left], str[right] = str[right], str[left] left++ right-- } return string(str) } func main() { fmt.Println(reverseVowels("hello")) fmt.Println(reverseVowels("leetcode")) }
代码2: 递归法
package main import ( "fmt" "strings" ) func reverseVowels(s string) string { vowels := "aeiouAEIOU" str := []byte(s) reverse(str, 0, len(s)-1, vowels) return string(str) } func reverse(str []byte, left, right int, vowels string) { if left >= right { return } for left < right && !strings.ContainsAny(vowels, string(str[left])) { left++ } for left < right && !strings.ContainsAny(vowels, string(str[right])) { right-- } str[left], str[right] = str[right], str[left] reverse(str, left+1, right-1, vowels) } func main() { fmt.Println(reverseVowels("hello")) fmt.Println(reverseVowels("leetcode")) }
代码3: 栈(stack)
package main import ( "fmt" "strings" ) func reverseVowels(s string) string { vowels := "aeiouAEIOU" stack := []byte{} for _, char := range s { if strings.ContainsAny(vowels, string(char)) { stack = append(stack, byte(char)) } } result := []byte(s) for i, char := range s { if strings.ContainsAny(vowels, string(char)) { result[i] = stack[len(stack)-1] stack = stack[:len(stack)-1] } } return string(result) } func main() { fmt.Println(reverseVowels("hello")) fmt.Println(reverseVowels("leetcode")) }
输出:
holle
leotcede
347. 前 K 个高频元素 Top-k Frequent Elements
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
提示:
1 <= nums.length <= 10^5
k
的取值范围是[1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前
k
个高频元素的集合是唯一的
进阶:你所设计算法的时间复杂度 必须 优于 O(n log n)
,其中 n
是数组大小。
代码: 桶排序
package main import "fmt" func topKFrequent(nums []int, k int) []int { count := make(map[int]int) for _, num := range nums { count[num]++ } buckets := make([][]int, len(nums)+1) for num, freq := range count { buckets[freq] = append(buckets[freq], num) } result := make([]int, 0) for i := len(nums); i >= 0 && len(result) < k; i-- { result = append(result, buckets[i]...) } return result[:k] } func main() { fmt.Println(topKFrequent([]int{1, 1, 1, 2, 2, 3}, 2)) fmt.Println(topKFrequent([]int{1}, 1)) }
输出:
[1 2]
[1]
🌟 每日一练刷题专栏 🌟
✨持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Rust每日一练 专栏 (2023.5.16~)更新中... |
|
Golang每日一练 专栏 (2023.3.11~)更新中... |
|
Python每日一练 专栏 (2023.2.18~2023.5.18)暂停更 |
|
C/C++每日一练 专栏 (2023.2.18~2023.5.18)暂停更 |
|
Java每日一练 专栏 (2023.3.11~2023.5.18)暂停更 |