目录
345. 反转字符串中的元音字母 Reverse Vowels Of A String 🌟
347. 前 K 个高频元素 Top-k Frequent Elements 🌟🌟
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/