字符串反转算法详解
基础字符串反转
字符串反转是最常见的编程面试题之一。给定一个字符串,要求将其字符顺序完全颠倒。
char* reverseString(char* str) {
char* end = str;
char* start = str;
// 定位到字符串末尾
while(*end) end++;
end--;
// 双指针交换字符
while(end > start) {
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
return str;
}
递归实现方式
使用递归的思想,通过交换首尾字符并递归处理中间部分来实现反转。
void recursiveReverse(char* str, int left, int right) {
if(left >= right) return;
// 交换边界字符
char temp = str[left];
str[left] = str[right];
str[right] = temp;
// 递归处理内部字符
recursiveReverse(str, left + 1, right - 1);
}
无额外空间的位运算方法
利用异或运算的特性,在不使用临时变量的情况下完成字符交换。
char* xorReverse(char* str) {
char* head = str;
char* tail = str;
// 找到字符串结尾
while(*(tail + 1)) tail++;
// 使用异或交换字符
while(tail > head) {
*head ^= *tail;
*tail ^= *head;
*head ^= *tail;
head++;
tail--;
}
return str;
}
按单词反转句子
给定句子"This is sample text",要求输出"text sample is This"。
void reverseWordRange(char* begin, char* end) {
while(begin < end) {
char temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
}
char* reverseWordsInSentence(char* sentence) {
char* wordStart = sentence;
char* wordEnd = sentence;
// 逐个处理每个单词
while(*wordEnd) {
if(*wordEnd == ' ') {
reverseWordRange(wordStart, wordEnd - 1);
wordEnd++;
wordStart = wordEnd;
} else {
wordEnd++;
}
}
// 处理最后一个单词
reverseWordRange(wordStart, wordEnd - 1);
// 整体反转句子
wordEnd--;
reverseWordRange(sentence, wordEnd);
return sentence;
}
逆序输出实现
不需要修改原字符串,仅逆序打印字符内容。
// 方法一:计算长度后逆序遍历
void printReverse1(const char* str) {
int length = 0;
const char* ptr = str;
while(*ptr++) length++;
for(int i = length - 1; i >= 0; i--) {
std::cout << str[i];
}
}
// 方法二:双遍历法
void printReverse2(const char* str) {
const char* end = str;
while(*end) end++;
end--;
while(end >= str) {
std::cout << *end;
end--;
}
}
// 方法三:递归输出
void printReverse3(const char* str) {
if(*str == '\0') return;
printReverse3(str + 1);
std::cout << *str;
}