
2026-05-30:反转一个字符串里的字母后反转特殊字符。用go语言,给定一个只包含小写英文字母和特殊字符的字符串 s。按顺序进行两步变换:先把所有小写字母的相对顺序整体反过来,并放回到它们原来所在的位置;再把所有特殊字符的相对顺序整体反过来,并放回到它们原来所在的位置。最终返回变换后的字符串。
1 <= s.length <= 100。
s 仅由小写英文字母和 "!@#$%^&*()" 中的特殊字符组成。
输入: s = "!@#$%^&*()"。
输出: ")(*&^%$#@!"。
解释:
字符串不包含字母。字符串全部由特殊字符组成,因此反转特殊字符即反转整个字符串。
题目来自力扣3823。
输入字符串:!@#$%^&*(),全程无小写字母,全是特殊字符。
把字符串!@#%^&*()转换成字节数组t,数组元素依次为:!、@、#、
是小写字母(a-z)i=0(左指针)、j=9(右指针);)、(、*、&、^、%、$、#、@、!。举个例子:输入a!b@c
reverse(判断:是字母):a!b@c → 字母反转后 → c!b@a。不是小写字母(即特殊字符))、(、*、&、^、%、$、#、@、!;)、(、*、&、^、%、$、#、@、!不变。最终得到字符串:)(*&^%$#@!,与题目要求的输出一致。
总时间复杂度:O(n) + O(n) + O(n) + O(n) = O(n) (线性复杂度,执行时间与字符串长度成正比)
额外空间指:除了输入数据外,程序额外开辟的内存空间。
t,开辟了长度为n的字节数组,占用O(n)空间;总额外空间复杂度:O(n) (需要额外开辟和输入字符串等长的存储空间)
.
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)
}

.
# -*-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()
.
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
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;
}

·