2017-01-02 47 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; 
}