我遇到了this CodingBat递归问题:
给定一个字符串,递归返回一个“已清理”的字符串,其中相同的相同字符已减少为单个字符。所以“yyzzza”会产生“yza”。
stringClean("yyzzza") → "yza"
stringClean("abbbcdd") → "abcd"
stringClean("Hello") → "Helo"
我可以使用循环来解决它,但这是不允许的,因为问题应该是使用递归来解决的。有没有办法解决这个问题而不使用循环并只使用递归?没有全局变量,没有循环。我甚至想过在参数中编码一些信息,但我认为这也是作弊。
我以前的程序没有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) );
}
答案 0 :(得分:6)
我的问题如下,有没有办法在不使用循环和仅使用递归的情况下解决此问题。没有全局变量,没有循环。
答案:是的。这很简单。请尝试以下:
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));
}
}
您的CodingBat结果如下:
stringClean(“yyzzza”)→“yza”“yza”确定
stringClean(“abbbcdd”)→“abcd”“abcd”确定
stringClean(“你好”)→“Helo”“Helo”确定
stringClean(“XXabcYY”)→“XabcY”“XabcY”确定
stringClean(“112ab445”)→“12ab45”“12ab45”确定
stringClean(“Hello Bookkeeper”)→“Helo Bokeper”“Helo Bokeper”确定
其他测试确定
答案 1 :(得分:1)
我的问题如下,有没有办法在不使用循环和仅使用递归的情况下解决此问题。没有全局变量,没有循环。
答案是"是的,有可能"。
提示:
答案 2 :(得分:0)
public String stringClean(String str) {
if (str == null) {
return null;
} else if (str.length() > 1) {
String k = str.substring(0, 1);
if (str.charAt(0) == str.charAt(1)) {
String tmp = stringClean(str.substring(2));
return k + stringClean(tmp);
} else {
return k + stringClean(stringClean(str.substring(1)));
}
} else {
return str;
}
}
答案 3 :(得分:0)
这是我的答案
public String stringClean(String str) {
if(str.isEmpty()) return "";
if(str.length()==1)return str;
if(str.length() > 1 && !str.substring(0,1).equals(str.substring(1,2)))
return str.substring(0,1) + stringClean(str.substring(1));
return ""+stringClean(str.substring(1));
}