我最近在接受采访时被问到这个问题。作为一名刚毕业的学生,只有2年的编程(所有的学校工作),我都不知所措。我有一个模糊的想法,但我确定我失败了。这就是我写的:
string Reverse(string word, string reversed)
{
if(word.length() == 0)
{
return reversed;
}
else
{
string temp;
reversed = word.substr(0,1) + reversed;
temp = word.substr(1);
Reverse(temp, reversed);
}
return reversed;
}
现在我回家了,我正在测试它,返回只是输入中的第一个字母。我模糊地熟悉递归的概念,但我显然在这方面失败了。任何帮助/指针/建议非常感谢。谢谢。
编辑: 在Dennis Meng的帖子之后,我做了以下改变:
string Reverse(string word, string reversed)
{
if(word.length() == 0)
{
return reversed;
}
else
{
string temp;
reversed = word.substr(0,1) + reversed;
temp = word.substr(1);
return Reverse(temp, reversed);
}
}
现在,我得到了正确的返回值。非常感谢你。
答案 0 :(得分:2)
这里出了什么问题:
else
{
string temp;
reversed = word.substr(0,1) + reversed;
temp = word.substr(1);
Reverse(temp, reversed); // <-- Here's your problem
}
return reversed;
}
你知道这个电话应该返回正确答案,为什么不回复呢?换句话说,如果你做了什么
else
{
string temp;
reversed = word.substr(0,1) + reversed;
temp = word.substr(1);
return Reverse(temp, reversed);
}
}
代替?您的代码仅返回第一个字母的具体细节涉及传递引用/按值传递;因为传递值的东西,你从来没有真正使用过递归调用中所做的事情。 (你刚刚拨打电话,扔掉了它返回的内容。)
答案 1 :(得分:1)
我不确定你为什么在这里使用递归。这真的没必要:
string Reverse(string word)
{
string reversed = "";
if(word.length() == 0)
{
return reversed;
}
for (int i = word.length()-1; i>=0; i--){
reversed = reversed+word[i];
}
return reversed;
}
答案 2 :(得分:1)
string Reverse(string word, string reversed)
{
...
Reverse(temp, reversed);
首先,您应该通过const引用传递word
,并通过引用传递reversed
。当你调用递归函数时,你正在复制每个字符串,所以最外面的函数看不到它们做的任何事情。另一种选择是将递归函数的结果分配给reversed
,但是到处都有一些愚蠢的字符串副本。所以:通过引用传递变量。
第二:有更简单的方法来反转字符串:
string Reverse(string word) //caller should _not_ see my changes, so I pass by value
{
for(int i=0; i<word.size()/2; ++i) { //for each letter in the first half
int otherindex = word.size()-1-i; //find the letter on the other half
char t = word[i]; //and swap them
word[i] = word[otherindex];
word[otherindex] = t;
}
return word; //return the result
}
答案 3 :(得分:0)
字符串只是一个字符数组。通常在这种情况下,您应该使用一个字符数组来解释算法。这是一种更好的方法。
void reverse(char* str, int len)
{
for (int i = 0, j = len -1 ; i < len / 2; ++i, --j) {
// Swap the values as i and j.
int temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
如果在Java中询问相同的问题,则必须确保将字符串转换为char []数组,然后将其转换为字符串。这有助于将创建的对象数量保持最小。至少,你应该使用StringBuilder。
答案 4 :(得分:0)
这是另一种解决方案(类似于已发布的解决方案)。 但是现在我看到这个解决方案对你来说不合适,因为它使用std东西。
std::string reverse(std::string const& character_queue_) {
using namespace std;
string result;
if(!character_queue_.empty()) {
vector<char> character_stack;
std::copy(character_queue_.begin(),character_queue_.end(),std::back_inserter(character_stack));
while(!character_stack.empty()) {
result.push_back(character_stack.back());
character_stack.pop_back();
}
}
return result;
}
答案 5 :(得分:-2)
只是建议一种更好的处理递归的方法:
在C ++中使用递归进行字符串反转:
#include <iostream>
#include <string>
using namespace std;
string reverseStringRecursively(string str){
if (str.length() == 1) {
return str;
}else{
return reverseStringRecursively(str.substr(1,str.length())) + str.at(0);
}
}
int main()
{
string str;
cout<<"Enter the string to reverse : ";
cin>>str;
cout<<"The reversed string is : "<<reverseStringRecursively(str);
return 0;
}