我正在尝试编写一个递归函数,给定一个字符串,递归地计算一个新字符串,其中所有小写“x”字符都已移动到字符串的末尾。
例如,
moveXs("xxre") --> "rexx"
moveXs("xxhixx") --> "hixxxx"
moveXs("xhixhix") --> "hihixxx"
我对C++相对较新,尤其是递归(不幸的是该函数必须使用这种方法来解决问题),所以我在这个问题上遇到了麻烦。下面是我迄今为止编写的代码,但它似乎只返回空字符串,我一生都无法弄清楚为什么。
string moveXs(const string& str)
{
string strCopy = str;
if (strCopy.length() <= 1)
{
return str;
}
else if (strCopy[0] == 'x')
{
strCopy = strCopy.substr(1, strCopy.length() - 1) + str[0];
return moveXs(strCopy.substr(0, (strCopy.length() - 2)));
}
else
{
return strCopy.substr(0, 1) + moveXs(strCopy.substr(1, strCopy.length() - 1));
}
}
任何帮助或建议将不胜感激!
看起来您刚刚遇到了一些索引问题。我在这里修改了您的代码,并记下新的返回值。我还去掉了无关的第二根弦。
string moveXs(const string& str)
{
if (str.length() <= 1)
{
return str;
}
else if (str[0] == 'x')
{
return moveXs(str.substr(1, (str.length() - 1))) + str[0];
}
else
{
return str[0] + moveXs(str.substr(1, str.length()));
}
}
您可以在这里看到它的实际效果:http://ideone.com/aT75l5
一种简单的方法可以是从头到尾遍历字符串,计数并删除“x”。然后在前一个字符串中追加“x”计数次数。
string MoveX(string str,int n){
if(n==0 || n==1){
return str;
}
if(str[n-1]=='x'){
str[n-1]=str[n-1]-'x';
str=str+"x";
}
string atr=MoveX(str,n-1);
return atr;
}