将 char [] str = “hello,you,world” 改为 “world,you,hello“,要求空间复杂度为1
题目:
将 char [] str = “hello,you,world” 改为 "world,you,hello",要求空间复杂度为1
(也就是使用的变量只能是单个字符或者常数,不能使用数组!!!!!)
解答:
实现的关键点在于:
- 整体反转字符串。只用自身的字符串空间!
- 逐个反转子字符串。仍然是只用自身的字符串空间!
- 空间复杂度为 O(1),意味着不能使用额外的内存空间。
C语言实现:
#include <stdio.h>
#include <string.h>
// 工具函数:反转字符串
void reverse(char str[], int start, int end) {
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
// 主函数
int main() {
char str[] = "hello,you,world"; // 原始字符串
int len = strlen(str);
// Step 1: 整体反转字符串
reverse(str, 0, len - 1);
// Step 2: 逐个反转子字符串
int start = 0;
for (int i = 0; i <= len; i++) {
if (str[i] == ',' || str[i] == '\0') {
reverse(str, start, i - 1); // 反转每个子字符串
start = i + 1;
}
}
// 输出结果
printf("Reversed string: %s\n", str);
return 0;
}
python实现:
def reverse_string(s, start, end):
# 将字符串列表部分反转
while start < end:
s[start], s[end] = s[end], s[start]
start += 1
end -= 1
def reverse_words_in_string(s):
# 将字符串转为列表以便修改
str_list = list(s)
n = len(str_list)
# Step 1: 整体反转
reverse_string(str_list, 0, n - 1)
# Step 2: 按单词反转
start = 0
for i in range(n + 1):
if i == n or str_list[i] == ',':
reverse_string(str_list, start, i - 1)
start = i + 1
return ''.join(str_list)
# 测试
original = "hello,you,world"
result = reverse_words_in_string(original)
print("Reversed string:", result)