Go语言实现字符串中字母与特殊字符的反转
2026年5月30日:字符串反转算法题精讲——先逆序字母再翻转特殊字符。给定一个仅包含小写英文字母与特殊字符的字符串,要求分两步操作:首先将所有小写字母的相对顺序整体颠倒,重新放回原位;接着将所有特殊字符的相对顺序整体翻转,同样放回原位。最终输出变换后的字符串。本题源自力扣第3823题,字符串长度范围为1至100,特殊字符限定为“!@#$%^&*()”。
举一个极端边界案例:输入全特殊字符 !@#$%^&*(),输出应为 )(*&^%$#@!。为什么是这个结果?因为字符串中没有字母,第一步反转字母实际上不会有任何操作,第二步反转特殊字符相当于直接反转整个字符串。理解了这一逻辑,我们就能深入探讨具体实现细节了。
一、分步骤执行过程(输入:!@#$%^&*())
输入字符串:!@#$%^&*()。全程不含小写字母,全部为特殊字符,非常适合用来验证算法的边界处理能力。
步骤1:执行 reverseByType 函数,将字符串转为字节切片
首先将字符串转换成字节数组 t,数组元素依次为:!、@、#、$、%、^、&、*、(、),共10个元素。
步骤2:第一次调用 reverse 函数(处理小写字母)
- 判断条件:
是小写字母(a-z) - 执行逻辑:
- 初始化双指针
i=0(左指针)、j=9(右指针); - 左指针向右遍历:所有元素都是特殊字符,不满足“是小写字母”的条件,左指针停下;
- 右指针向左遍历:同样都是特殊字符,不满足条件,右指针停下;
- 交换左右指针指向的元素,然后指针向内移动;
- 循环持续到指针相遇,最终结果:字节数组被完全反转!
- 初始化双指针
- 第一次反转后字节数组:
)、(、*、&、^、%、$、#、@、!。
补充:如果字符串包含字母的执行逻辑(帮助理解)
举个例子:输入 a!b@c
- 第一次
reverse(判断:是字母):- 跳过字母,只交换特殊字符?不,逻辑是:满足条件(是字母)就跳过,不满足(特殊字符)就停下交换;
- 最终效果:字母的相对顺序整体反转,放回原位置,特殊字符位置不变;
- 示例:
a!b@c→ 字母反转后 →c!b@a。
步骤3:第二次调用 reverse 函数(处理特殊字符)
- 判断条件:
不是小写字母(即特殊字符) - 执行逻辑:
- 此时字节数组是
)、(、*、&、^、%、$、#、@、!; - 遍历所有元素:全是特殊字符,都满足“不是小写字母”的条件;
- 双指针会直接遍历到相遇,没有任何字符需要交换;
- 此时字节数组是
- 第二次反转后字节数组:保持
)、(、*、&、^、%、$、#、@、!不变。
步骤4:将字节切片转回字符串
最终得到字符串:)(*&^%$#@!,与题目要求的输出完全一致。
二、时间复杂度分析
- 字符串转字节切片:O(n),n是字符串长度;
- 第一次reverse函数:双指针遍历整个切片一次,O(n);
- 第二次reverse函数:双指针遍历整个切片一次,O(n);
- 字节切片转回字符串:O(n);
总时间复杂度:O(n) + O(n) + O(n) + O(n) = O(n)。线性复杂度,执行时间与字符串长度成正比,性能优异。
三、额外空间复杂度分析
额外空间指除了输入数据外,程序额外开辟的内存空间。
- 代码中将字符串转为字节切片
t,开辟了长度为n的字节数组,占用O(n)空间; - 所有变量(指针i、j、临时变量等)都是常数级空间,O(1);
总额外空间复杂度:O(n)。需要额外开辟和输入字符串等长的存储空间,属于可接受的线性开销。
总结
- 执行过程:输入全特殊字符→转字节切片→第一次反转字母(实际反转整个字符串)→第二次反转特殊字符(无交换)→转回字符串;
- 时间复杂度:O(n)(线性复杂度);
- 额外空间复杂度:O(n)(需要等长的字节切片存储数据)。
Go完整代码如下:
package main
import ("fmt")
func reverse(t []byte, f func(byte) bool) {
i, j := 0, len(t)-1
for i < j {
for i < j && f(t[i]) {
i++
}
for i < j && f(t[j]) {
j--
}
t[i], t[j] = t[j], t[i]
i++
j--
}
}
func reverseByType(s string) string {
t := []byte(s)
reverse(t, func(ch byte) bool { return 'a' <= ch && ch <= 'z' })
reverse(t, func(ch byte) bool { return !('a' <= ch && ch <= 'z') })
return string(t)
}
func main() {
s := "!@#$%^&*()"
result := reverseByType(s)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
def reverse(t, condition_func):
"""按条件反转字符序列"""
i, j = 0, len(t) - 1
t_list = list(t) # 转换为列表以便修改
while i < j:
# 从左向右找到第一个不满足条件的字符
while i < j and condition_func(t_list[i]):
i += 1
# 从右向左找到第一个不满足条件的字符
while i < j and condition_func(t_list[j]):
j -= 1
# 交换
t_list[i], t_list[j] = t_list[j], t_list[i]
i += 1
j -= 1
return ''.join(t_list)
def reverse_by_type(s):
"""按字符类型反转字符串"""
# 第一次反转:对小写字母进行反转
s = reverse(s, lambda ch: 'a' <= ch <= 'z')
# 第二次反转:对非小写字母进行反转
s = reverse(s, lambda ch: not ('a' <= ch <= 'z'))
return s
def main():
s = "!@#$%^&*()"
result = reverse_by_type(s)
print(result)
if __name__ == "__main__":
main()

C++完整代码如下:
#include
#include
#include
#include
void reverse(std::string& t, bool (*f)(char)) {
int i = 0, j = t.length() - 1;
while (i < j) {
// 从左向右找到第一个不满足条件的字符
while (i < j && f(t[i])) {
i++;
}
// 从右向左找到第一个不满足条件的字符
while (i < j && f(t[j])) {
j--;
}
// 交换
std::swap(t[i], t[j]);
i++;
j--;
}
}
std::string reverseByType(const std::string& s) {
std::string t = s; // 复制字符串
// 第一次反转:对小写字母进行反转
reverse(t, [](char ch) -> bool {
return 'a' <= ch && ch <= 'z';
});
// 第二次反转:对非小写字母进行反转
reverse(t, [](char ch) -> bool {
return !('a' <= ch && ch <= 'z');
});
return t;
}
int main() {
std::string s = "!@#$%^&*()";
std::string result = reverseByType(s);
std::cout << result << std::endl;
return 0;
}

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
WPS AI生成专业PPT模板技巧与工作总结范文
每逢职场汇报高峰期,项目总结、年终述职等任务纷至沓来,你是否也常感到时间紧迫、内容匮乏且思路混乱?此时,一份设计得当的PPT模板,往往能成为你高效表达的得力助手。它不仅关乎专业形象的塑造,更是牢牢抓住听众注意力的核心要素。毕竟,在信息爆炸的时代,观众的耐心可能比金鱼还要短暂。 令人欣慰的是,如今我们
AI提升企业公文写作效率实用指南与范文
适合需求: 在当今企业与组织机构中,公文撰写几乎已成为每位职场人士必须掌握的“基础技能”。无论是会议记录、通知公告,还是各类总结报告,这类写作需求几乎无处不在。然而,真正动笔时,不少人却感到棘手:如何将思路清晰、准确地表达在纸上? 范文 Demo: 公文的重要性不言自明。它不仅是信息传达的桥梁,更直
Excel两表数据对比技巧,提升工作效率实用方法
```html Excel两个表格数据对比的高效方法 在日常工作中,经常需要对比两个Excel表格中的数据,快速找出差异或合并信息。无论是数据分析师还是普通办公人员,掌握这些Excel数据对比技巧都能显著提升工作效率。以下介绍三种实用的表格对比方法,各有侧重,可根据实际需求灵活选用。 方法一:使用条
如何撰写真诚辞职报告?范文与提示词
辞职报告适用场景与要求: 辞职报告范文模板 尊敬的领导: 此刻,我怀着复杂与感激的心情向您递交这份辞职申请。首先,衷心感谢您在我任职期间给予的悉心指导与关怀。正是在您的支持与信任下,我得以持续成长、不断进步,并收获了极为宝贵的工作经验。 此次离职决定并非一时冲动,而是经过深思熟虑。主要基于以下几点:
Excel汇总其他表格数据方法,提升工作效率
Excel跨表格汇总数据的4种高效方法(附公式详解) 在日常办公中,很多人经常遇到这样的场景:手头有多个Excel表格,数据分散在不同的文件或工作表中,需要合并进行整体分析,结果要么是手动复制粘贴效率低下,要么是公式写错导致混乱。实际上,Excel内置了多种成熟的数据汇总手段,能帮你快捷准确地将分散
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

