
2026-08-09:按频率对元音排序。用go谈话,给定个一齐由小写英笔墨母组成的字符串,你需要对其中的元音字母(即 a、e、i、o、u)进行再行陈设,而通盘非元音字母保握原来的位置仁和序不变。陈设的规定是:先统计每个元音字母在通盘这个词字符串中出现的次数,次数越多的元音字母在效果中越靠前;要是两个不同的元音字母出现次数调换塔城隔热条PA66生产设备,则比拟它们各安宁原字符串中次出现的位置,谁的位置靠前,谁就在陈设效果中排在前边。后输出经过这么处分的无缺字符串。
1
s 由小写英笔墨母组成。
输入: s = "leetcode"。
输出: "leetcedo"。
讲明:
字符串中的元音字母为 ['e', 'e', 'o', 'e'],其出现频率为:e = 3,o = 1。
按出现频率非递加排序后,再放回原来的元音位置,得到 "leetcedo"。
题目来独力扣3913。
解题经过胪陈
1. 开辟元音识别机制
构造个长度为 123(包含字符 'z' 的 ASCII 码)的整型数组 mp,将其通盘元素运回荡为 0。然后将字符 'a'、'e'、'i'、'o'、'u' 对应的数组位置分歧秀雅为 1、2、3、4、5。这么,后续在遍历字符串时,只需将现时字符的 mp 值减去 1,便能得到它在计数数组中的索引(0~4)。要是该字符不是元音(mp 值为 0),则计较出的索引为 -1,可据此快速过滤非元音字符。
2. 统计元音频率并记载次出现功令扫描戒指后,cnt 中存储了每个元音的出现频率,vowels 切片中循序出现位置保存了通盘出现过的元音(长度至多为 5)。
• 准备个长度为 5 的整型数组 cnt,用于记载 a、e、i、o、u 各自出现的总次数,运转均为 0。
• 准备个空的字节切片 vowels,用于按元音在字符串中次出现的功令存放这些元音字母。
• 从新到尾扫描原字符串 s 中的每个字符 ch:
• 通过 mp[ch] - 1 获取该字符的索引 x;要是 x
• 查抄 cnt[x] 是否为 0。若为 0,示意这是该元音字母在字符串中次出现,因此将 ch 追加到 vowels 切片尾部。
• 将 cnt[x] 的值加多 1,完成对该元音的次计数。
3. 对元音按规定排序
使用踏实排序算法对 vowels 切片进行排序,排序的比拟规定为:取出两元音对应的出现次数,次数大的排在前边。由于排序是踏实的,当两个元音出现次数调换期,它们在 vowels 切片中的原有相对功令会被保留。而 vowels 切片的构建经过保证了它即是按各元音在原字符串中次出现的位置功令陈设的,因此踏实排序后,频率调换的元音会保握“次出现位置越靠前越排在前边”的功令。
4. 将排序效果再行放回字符串
• 将原字符串 s 调度为可修改的字节切片 t,行动输出效果的骨架。
• 运回荡个索引变量 j = 0,指向 vowels 切片中现时正在使用的元音。
• 再次从新遍历 t 的每个字符位置 i:
• 要是现时字符 ch = t[i] 对应的 mp[ch] == 0,证实该位置短长元音字母,径直保留原字符不变,继续下个位置。
• 要是 mp[ch] != 0,隔热条PA66生产设备证实该位置正本是元音,需要进行替换。将 t[i] 改为 vowels[j],也即是现时应使用的元音。
• 找出被填入元音在计数数组中的索引 x = mp[t[i]] - 1,然后将该元音的剩余次数 cnt[x] 减 1。
• 要是 cnt[x] 减少后变为 0,意味着这种元音仍是被一齐破钞完,于是将 j 加多 1,切换到 vowels 中的下个元音,供后续的元音位置使用。
5. 生成终字符串
将修改竣事的字节切片 t 调度为字符串并复返。此时,通盘非元音位置保握原样,通盘元音位置则按照条目(频率非递加,频率调换则循序出现位置排序)被再行陈设后的元音填充。
复杂度分析
• 技能复杂度
通盘这个词经过主要包含两次对字符串的无缺遍历(统计和替换),每次遍历皆只进行常数别的操作(数组拜访、比拟、赋值等),因此技能复杂度为 O(n),其中 n 为字符串的长度。对 vowels 切片进行排序的操作,因其长度不外 5,可视为常数技能 O(1)。总技能复杂度为 O(n)。
• 衰败空间复杂度塔城隔热条PA66生产设备
算法中使用了长度为 5 的 cnt 数组、长度至多为 5 的 vowels 切片以及个长度与原字符串调换的字节切片 t。前三者的空间占用为 O(1);而 t 是为了构建修改后的字符串而从输入复制的份本,其长度等于 n,需要 O(n) 的衰败空间。因此,总的衰败空间复杂度为 O(n)。
Go无缺代码如下:
.
package main
import (
"fmt"
"slices"
)
var mp = ['z' + 1]int{'a': 1, 'e': 2, 'i': 3, 'o': 4, 'u': 5}
func sortVowels(s string) string {
cnt := [5]int{}
vowels := []byte{} // 长度至多为 5
for _, ch := range s {
x := mp[ch] - 1
if x
continue塔城隔热条PA66生产设备
}
if cnt[x] == 0 {塔城隔热条PA66生产设备
vowels = append(vowels, byte(ch))
}
cnt[x]++
}
// 把 aeiou 按照出现次数从大到小排序
slices.SortStableFunc(vowels, func(a, b byte) int { return cnt[mp[b]-1] - cnt[mp[a]-1] })
t := []byte(s)
j := 0
for i, ch := range t {
if mp[ch] == 0 {
continue
}
t[i] = vowels[j]
x := mp[t[i]] - 1
cnt[x]--
if cnt[x] == 0 {
j++ // 破钞完毕,切换到下种元音
}
}
return string(t)
}
func main {
s := "leetcode"
result := sortVowels(s)
fmt.Println(result)
}
Python无缺代码如下:
.
# -*-coding:utf-8-*-
def sort_vowels(s: str) -> str:
# 元音到索引的映射 (a->0, e->1, i->2, o->3, u->4)
vowel_to_idx = {'a': 0, 'e': 1, 'i': 2, 'o': 3, 'u': 4}
cnt = [0] * 5 # 各元音出现次数
vowels = [] # 出现过的元音,循序出现功令
# 统计元音频率,记载次出现的元音功令
for ch in s:
if ch in vowel_to_idx:
idx = vowel_to_idx[ch]
if cnt[idx] == 0:
vowels.append(ch)
cnt[idx] += 1
# 踏实排序:频率从大到小,频率调换保握次出现功令
vowels.sort(key=lambda c: -cnt[vowel_to_idx[c]])
# 替换元音位置
res = list(s)
j = 0
for i, ch in enumerate(res):
if ch not in vowel_to_idx:
continue
# 用现时排序中的元音替换
res[i] = vowels[j]
idx = vowel_to_idx[res[i]]
cnt[idx] -= 1
if cnt[idx] == 0:
j += 1
return ''.join(res)
if __name__ == '__main__':
test_str = "leetcode"
print(sort_vowels(test_str))
C++无缺代码如下:
.
#include
#include
#include
#include
#include
std::string sortVowels(const std::string& s) {
// 元音字符到索引的映射,索引 0-4 分歧对应 a, e, i, o, u
std::array vowelIndex{};
vowelIndex.fill(-1);
vowelIndex['a' - 'a'] = 0;
vowelIndex['e' - 'a'] = 1;
vowelIndex['i' - 'a'] = 2;
vowelIndex['o' - 'a'] = 3;
vowelIndex['u' - 'a'] = 4;
std::array cnt{}; // 各元音的出现次数
std::vector vowels; // 出现过的元音,循序出现功令
for (char ch : s) {
int idx = (ch >= 'a' && ch
if (idx
if (cnt[idx] == 0) {
vowels.push_back(ch);
}
cnt[idx]++;
}
// 踏实排序:频率从大到小,频率调换期保握次出现的功令
std::stable_sort(vowels.begin, vowels.end,
[&](char a, char b) {
return cnt[vowelIndex[a - 'a']] > cnt[vowelIndex[b - 'a']];
});
std::string t = s;
size_t j = 0;
for (char& ch : t) {
int idx = (ch >= 'a' && ch
if (idx
ch = vowels[j];
int newIdx = vowelIndex[ch - 'a'];
cnt[newIdx]--;
if (cnt[newIdx] == 0) {
j++; // 现时元音破钞竣事,切换下个
}
}
return t;
}
int main {
std::string s = "leetcode";
std::string result = sortVowels(s);
std::cout
return 0;
}
·
咱们深信东说念主工智能为以前东说念主提供了种“增强器用”,并努力于共享全位的AI常识。在这里,您不错找到新的AI科普著作、器用评测、普及率的诡秘以及行业瞻念察。
接待关怀“福大大架构师逐日题”,发音讯可取得口试贵寓,让AI助力您的未来发展。手机:18631662662(同微信号)相关词条:不锈钢保温施工 塑料管材生产线 钢绞线厂家 玻璃棉板 泡沫板橡塑板专用胶
1.本网站以及本平台支持关于《新广告法》实施的“极限词“用语属“违词”的规定,并在网站的各个栏目、产品主图、详情页等描述中规避“违禁词”。
2.本店欢迎所有用户指出有“违禁词”“广告法”出现的地方,并积极配合修改。
3.凡用户访问本网页,均表示默认详情页的描述塔城隔热条PA66生产设备,不支持任何以极限化“违禁词”“广告法”为借口理由投诉违反《新广告法》,以此来变相勒索商家索要赔偿的违法恶意行为。