我被困在这个 CodingBat递归问题上:
给定一个字符串,递归返回一个"已清理"的字符串,其中相同的相同字符已减少为单个字符.所以"yyzzza"会产生"yza".
stringClean("yyzzza") ? "yza"
stringClean("abbbcdd") ? "abcd"
stringClean("Hello") ? "Helo"
Run Code Online (Sandbox Code Playgroud)
我可以使用循环来解决它,但这是不允许的,因为问题应该是使用递归来解决的.有没有办法解决这个问题而不使用循环并只使用递归?没有全局变量,没有循环.我甚至想过在参数中编码一些信息,但我认为这也是作弊.
我之前的程序没有while循环,我只能得到一半的答案.基本上,当我使用字符串参数调用我的函数时,我检查了前2个字符.如果它们是相同的,我将返回该字符并再次使用两个字符小的字符串调用该函数.但是,相同连续字符中的3个或4个字符串总是会使我的算法失败.
public String stringClean(String str) {
if (str.length() == 0)
return "";
if (str.length() > 1) {
int counter = 1;
char a = str.charAt(0);
char b = str.charAt(1);
if (a == b)
{
while (str.length() > 1)
{
a = str.charAt(0);
b = str.charAt(1);
if (a != b) break;
counter++;
str = str.substring(1);
}
return a + stringClean( str.substring(1) ) ;
}
}
return str.charAt(0) + stringClean (str.substring(1) );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是以下,有没有办法解决这个问题,而不使用循环和仅使用递归.没有全局变量,没有循环.
答:是的.这很简单.试试以下:
public String stringClean(String str) {
if (str.length() == 0)
return "";
if (str.length() == 1)
return str;
if(str.charAt(0) == str.charAt(1)){
return stringClean(str.substring(1));
}else{
return str.charAt(0)+ stringClean(str.substring(1));
}
}
Run Code Online (Sandbox Code Playgroud)
您的CodingBat结果如下:
stringClean( "yyzzza")→ "YZA" "YZA" OK
stringClean( "abbbcdd")→ "ABCD", "ABCD" OK
stringClean( "你好")→ "直升机", "直升机" OK
stringClean( "XXabcYY")→" XabcY" "XabcY" OK
stringClean( "112ab445")→ "12ab45" "12ab45" OK
stringClean( "你好簿记员")→ "直升机Bokeper" "直升机Bokeper" OK
等检查 确定