CodingBat——递归编码
CodingBat-- coding recursively
我正在尝试编码 bat 问题 repeatFront:
Given a string and an int n, return a string made of the first n characters of
the string, followed by the first n-1 characters of the string, and so on. You
may assume that n is between 0 and the length of the string, inclusive (i.e. n
= 0 and n <= str.length()).
repeatFront("Chocolate", 4) → "ChocChoChC"
repeatFront("Chocolate", 3) → "ChoChC"
repeatFront("Ice Cream", 2) → "IcI"
这是我正在尝试的代码:
public String repeatFront(String str, int n) {
if(n==0) {
return str;
}
sub = str.substring(0,n);
sub = sub+repeatFront(sub,n-1);
return sub;
}
我得到的错误是在我的字符串末尾有一个额外的字符。第一个示例将给出 "ChocChoChCC",第二个示例将给出 "ChoChCC",依此类推。我只想从概念上知道我做错了什么以及如何解决它。
啊,我发现你的问题了。
如果 n == 0
.
,则只能 return 空字符串
返回 str
将 return 第二次调用 repeatFront(Ch, 1)
和 repeatFront(C, 0)
时额外的最后一个字母 return C
。
通过将 n==0
上的 return 更改为 return "";
来修复:
if(n==0) {
return "";
}
嗯,这行得通 -
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
repeatFront("Chocolate", 4,sb);
System.out.println(sb);
}
public static void repeatFront(String str, int n,StringBuilder sb) {
if(n==0) {
return;
}
sb.append(str.substring(0,n));
repeatFront(str,n-1,sb);
}
}
问题 - 对于 n=0,您将返回 sub,因此您将获得最后一个额外字符。我使用了 StringBuilder
,它使它变得干净,也消除了为每次调用创建额外字符串对象的开销。
你可以使用这个:
public String repeatEnd(String str, int n) {
if (n == 0)
return "";
String res = re(str, n);
String resl ="";
for (int i =0 ; i < n ; i ++){
resl = resl + res;
}
return resl;
}
public String re(String s , int n){
String end = "";
int len = s.length();
end = s.substring(len-n , len);
return end;
}
public String repeatFront(String str, int n) {
//take a empty string
String temp = "";
//check if it greater then zero value of n
while(n>0)
{
//run a for loop and add the string data in temp string
for(int i=0;i<=n;i++)
{
temp = temp + str.substring(0,n);
//decrement the n value after every for loop
n--;
}
}
//now return the temp string
return temp;
}
public String repeatFront(String str, int n) {
String result="";
if(str.length()==0){
return "";
}
if(str.length()>=1){
for(int i=n;i>=1;i--){enter code here
String sub = str.substring(0,i);
result = result + sub;
}
return result;
}
你也可以用这个。
public String repeatFront(String str, int n){
int i;
String result = "";
for(i=n; 0<i; i--){
result += str.substring(0,i);
}
return result;
}
你也可以使用Java11String.repeat()
public String repeatEnd(String str, int n) {
return str.substring(str.length() - n).repeat(n);
}
我正在尝试编码 bat 问题 repeatFront:
Given a string and an int n, return a string made of the first n characters of the string, followed by the first n-1 characters of the string, and so on. You may assume that n is between 0 and the length of the string, inclusive (i.e. n = 0 and n <= str.length()).
repeatFront("Chocolate", 4) → "ChocChoChC" repeatFront("Chocolate", 3) → "ChoChC" repeatFront("Ice Cream", 2) → "IcI"
这是我正在尝试的代码:
public String repeatFront(String str, int n) {
if(n==0) {
return str;
}
sub = str.substring(0,n);
sub = sub+repeatFront(sub,n-1);
return sub;
}
我得到的错误是在我的字符串末尾有一个额外的字符。第一个示例将给出 "ChocChoChCC",第二个示例将给出 "ChoChCC",依此类推。我只想从概念上知道我做错了什么以及如何解决它。
啊,我发现你的问题了。
如果 n == 0
.
返回 str
将 return 第二次调用 repeatFront(Ch, 1)
和 repeatFront(C, 0)
时额外的最后一个字母 return C
。
通过将 n==0
上的 return 更改为 return "";
来修复:
if(n==0) {
return "";
}
嗯,这行得通 -
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
repeatFront("Chocolate", 4,sb);
System.out.println(sb);
}
public static void repeatFront(String str, int n,StringBuilder sb) {
if(n==0) {
return;
}
sb.append(str.substring(0,n));
repeatFront(str,n-1,sb);
}
}
问题 - 对于 n=0,您将返回 sub,因此您将获得最后一个额外字符。我使用了 StringBuilder
,它使它变得干净,也消除了为每次调用创建额外字符串对象的开销。
你可以使用这个:
public String repeatEnd(String str, int n) {
if (n == 0)
return "";
String res = re(str, n);
String resl ="";
for (int i =0 ; i < n ; i ++){
resl = resl + res;
}
return resl;
}
public String re(String s , int n){
String end = "";
int len = s.length();
end = s.substring(len-n , len);
return end;
}
public String repeatFront(String str, int n) {
//take a empty string
String temp = "";
//check if it greater then zero value of n
while(n>0)
{
//run a for loop and add the string data in temp string
for(int i=0;i<=n;i++)
{
temp = temp + str.substring(0,n);
//decrement the n value after every for loop
n--;
}
}
//now return the temp string
return temp;
}
public String repeatFront(String str, int n) {
String result="";
if(str.length()==0){
return "";
}
if(str.length()>=1){
for(int i=n;i>=1;i--){enter code here
String sub = str.substring(0,i);
result = result + sub;
}
return result;
}
你也可以用这个。
public String repeatFront(String str, int n){
int i;
String result = "";
for(i=n; 0<i; i--){
result += str.substring(0,i);
}
return result;
}
你也可以使用Java11String.repeat()
public String repeatEnd(String str, int n) {
return str.substring(str.length() - n).repeat(n);
}