对我的代码有一些澄清问题;问题是逆转空终止字符串。
以下是完整的参考代码:(编译和运行)
#include <iostream>
#include <cstring>
using namespace std;
void reverseString (char *str) {
char *end = str;
char temp;
while (*end != '\0')
{
end ++;
}
end--;
//swap
while (str < end) {
temp = *str;
*str++ = *end;
*end-- = temp;
}
}
int main() {
char str[] = "hello!";
reverseString (str);
cout << str;
}
while (str < end)
上面的语句是否比较了指针的地址?由于str是一个指针而end也是一个,并且指针包含地址,它是否检查str的地址是否小于end?
*str++ = *end;
此行将取消引用存储在end中的值,并将其设置为等于str的值。然后递增指针str?
最后,(最坏情况)时间复杂度 O(n)?
答案 0 :(得分:1)
第一个和第三个问题的答案是肯定的。在第二个问题中你有相反的变量(str
被取消引用,设置,然后递增,而不是相反)。具体来说:str
和end
都被取消引用(这就是*
运算符所做的)。取消引用的str
设置为已解除引用的end
。然后str
递增。
此外,reverseString()
将在数组末尾运行,导致未定义的行为,如果传入的字符串为空,则可能发生崩溃。需要在那里添加额外的代码来处理这种可能性,作为边缘情况。
答案 1 :(得分:1)
你有没有理由不使用STL?特别是std::reverse
?
#include <iostream>
#include <cstring>
#include <algorithm>
int main() {
char str[] = "hello!";
std::reverse(str, str + std::strlen(str));
std::cout << str;
}