如何应对Codingbat String-2 oneTwo挑战?

时间:2017-01-02 23:05:27

标签: java

以下是问题陈述:

  

给定一个字符串,通过在接下来的两个字符之后移动第一个字符来计算一个新字符串,因此“abc”产生“bca”。对每个后续的3个字符组重复此过程,因此“abcdef”产生“bcaefd”。最后忽略任何少于3个字符的组。

这是我的代码:

// oneTwo("abc") → "bca"
// oneTwo("tca") → "cat"
// oneTwo("tcagdo") → "catdog"  

public String oneTwo(String str) {
    String x = "";
    if (str.length() < 3) {
        return "";
        // return empty
    } else if (str.length() == 3) {
        String s = str.substring(1, str.length());
        x = s + str.substring(0, 1);      // last two + first char
    } else if (str.length() > 3) {
        int third = 2;
        // start with the third element index of 2
        for (int i = 0; i < str.length(); i++) {
            if (i == third) {
                // given three chars substring first char
                // substring last two chars and add that to x
                x += (str.substring(third - 1, third + 1) +
                        str.substring(third - 2, third - 2 + 1));
                third += 3;
                //work  with this line but why??????
            }
            //third +=3;
            // doesn't work with this line but why???????


        }// end of for loop
    }
    return x;
    // return modified string x
}

在if语句中有third +=3但是当我把它放在if语句之外时,我没有得到所需的输出。我真的不明白为什么?

9 个答案:

答案 0 :(得分:2)

希望这会有所帮助:

public String oneTwo(String str) {
    String str2 = "";
    for(int i=0; i<str.length()-2; i+=3) {
        str2 = str2+str.substring(i+1,i+3)+str.charAt(i);
    }
    return str2;
}

答案 1 :(得分:0)

因为将它放在循环之外会导致third过于频繁地增加。在第一次迭代i is 0, third is 5之后,下一次迭代产生i=1, third=8; i=2, third=11; i=3, third=14等等 - &gt; i永远不会达到第三位。

我会通过删除整个if语句来改进你的代码,将third全部删除,只需在for循环中递增3:

for( int i = 2; i < str.length(); i+=3){
    x += (str.substring(third-1, third+1) + 
          str.substring(third-2, third-2 + 1));
}

如果我没有误解你的代码,那么如果它们不是三个字符组的一部分,那么你就缺少留下最后一个字符的逻辑。

答案 2 :(得分:0)

如果您面对这样的效果,请拿一张纸并在代码的每一行后写下变量的值。

if块创建一个替代执行路径,如果条件为真,则在每个第三次循环迭代中。

if块后面的任何内容都在每次循环迭代中执行。

因此,当有问题的行位于if块内(在右大括号之前)时,变量third中的值仅在每第三次循环迭代时更改。

当您移动右括号后面的行时,赋值位于if块之外,因此执行每次循环迭代。

答案 3 :(得分:0)

对于comment = //使用此行,但为什么??????

&#34;第三&#34;的价值变量在for循环中变化,只有i等于第三个字符,否则第三个值将继续增加,例如。

当i = 0时,第三= 2 当i = 1时,第三= 5 当i = 2时,第三个= 8

所以if语句永远不会被触发,因此它不起作用。希望这是有道理的。

PS - 我强烈建议使用IDE调试器来正确理解这一点 PS - 为了性能原因,使用charAt方法比较子串方法

更好

答案 4 :(得分:0)

public String oneTwo(String str) {
    String temp = "";
    String result = "";
    int i = 0;
    while (str.substring(i).length() >= 3) {
        temp = str.substring(i, i + 3);
        result += temp.substring(1) + temp.charAt(0);
        i += 3;
    }
    return result;
}

答案 5 :(得分:0)

public String oneTwo(String str) {

 String str1 = "";
 if(str.length()<3){
  return str1; 
 }else if(str.length()>=3){
    for(int i =0; i<str.length()-2; i=i+3){
            str1 = str1 + str.substring(i+1,i+3)+ str.substring(i,i+1);

        }
 }

 return str1;
}

答案 6 :(得分:0)

public String oneTwo(String str) {
  if(str.length()<3)return "";
  return str.substring(1,3)+str.substring(0,1)+oneTwo(str.substring(3));
}

这作为递归问题很简单

答案 7 :(得分:0)

public String oneTwo(String str) {
        String newThreeChars = "";
        if(str.length()<3){
            return newThreeChars;
        }
        for(int i=0; i<str.length()/3; i+=3){
            String threeChars = str.substring(i,i+3);
            String redesigned = threeChars.substring(1) + threeChars.charAt(0);
            newThreeChars +=redesigned;
        }
        return newThreeChars;

    }

答案 8 :(得分:0)

另一种解决方案...

public String oneTwo(String str) {
  int i = 0;
  String result = "";
  Character tmpChar = '\0';
  
  while(i <= str.length()-3){
    tmpChar = str.charAt(i);
    result = result + str.charAt(i+1) + str.charAt(i+2) + tmpChar;
    tmpChar = '\0';
    i = i + 3;
  }
  
  return result;
}