2017-01-02 120 views
-3

这是问题的声明:如何解决Codingbat String-2的挑战?

给定一个字符串,通过移动的第一个字符来接下来的两个字符后,计算新的字符串,所以“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 
} 

随着third +=3 if语句,在里面工作,但是当我把if语句的那个​​之外我没有得到期望的输出。我不明白为什么?

+0

你的问题已经进行了分析。我建议你消耗你的输入字符串,而不是遍历字符。这将使您可以始终只查看前三个字符。这样,你所做的所有指标数学(并且从现在开始的三周内将无法轻松理解):)将会消失。 – thst

回答

0

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

我会通过降低整个if语句提高你的代码,删除third一起,只需3在for -loop增量:

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

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

0

如果您遇到这种情况,请拿一张纸并在代码的每一行后写下变量的值。


if块,如果条件为真,其是在每第三循环迭代产生的替代执行路径。

if块后面的任何内容均在之间执行,每循环迭代。

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

当您移动括号后面的行时,该分配位于if块之外,因此每执行循环迭代就执行

0

对于评论=//工作与这条线,但为什么??????

只有当i等于第三个字符时,第三个变量的值才会在for循环中被更改,否则第三个值将继续增加,例如。

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

所以if语句从未被触发,因此它不工作。希望这是有道理的。

PS - 我强烈建议使用IDE调试器来正确理解这一点。
PS - 这是更好地使用的charAt方法串性能原因方法

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; 
}