2016-12-27 112 views
1

我需要在給定的字符串中顛倒5個或更多字符長的字。例如: *給定​​的字符串:我的名字是邁克爾。 *輸出:我的名字是leahciM。顛倒字符串中的某些字

其餘的句子保持不變,只是這些長詞被顛倒。

到目前爲止,我想出了這一點:

public static String spinWords(String sentence) { 
    String[] splitWords = sentence.split(" "); 
    String reversedSentence = ""; 
    String reversedWord = ""; 
    for (String str : splitWords) { 
     if (str.length() >= 5) { 
      for (int i = str.length() - 1; i >= 0; i--) 
       reversedWord += (str.charAt(i) + " "); 
     } 
    } 
} 

而且我已經扭轉那些話,但 1)他們是在一個字符串,沒有空格 2)我不知道如何將它們放回到他們在串

回答

5

這地方是一個建議:

  • 編寫反轉字符串的方法:

    private static String reverse(String s) { ... } 
    
  • 然後在您的主要方法,調用它在必要時:

    if (str.length() >= 5) str = reverse(str); 
    
  • ,那麼你需要把背單詞一起,想必到reversedSentence字符串:

    reversedSentence += str + " "; //you will have an extra space at the end 
    

備註:

  • 使用StringBuilder可能證明比字符串連接更有效的更長的句子。
  • 你可以把所有的單詞背到List<String>內環路,並呼籲reversedSentence = String.join(" ", list)
  • 倒車字符串可以在一個行完成後 - 你應該找到大量相關Q &作爲對計算器。
+0

有沒有辦法在最後刪除該空間?我真的很喜歡你的方法,而不起訴StringBuilder(我不認爲我可以在codewars上使用額外的庫)。 – doublemc

+1

@doublemc *「您可以將所有單詞放回循環中的列表,並在循環後*調用reversedSentence = String.join(」「,list)*或使用String#trim()檢查其他答案' – m0skit0

+0

@doublemc一個訣竅是在你的循環中有一個'boolean firstWord = true':'if(firstWord){result = str; firstWord = false; } else {result + =「」+ str; }' – assylias

4

您可以使用StringBuilder

public static String spinWords(String sentence) { 
    String[] splitWords = sentence.split(" "); 
    StringBuilder builder = new StringBuilder(); 

    for (String str : splitWords) { 
     if (str.length() < 5) { 
      builder.append(str); 
     else 
      builder.append(new StringBuilder(str).reverse().toString()); 

     builder.append(" "); 
    } 

    return builder.toString().trim(); 
} 
0

無需使用任何你幾乎擁有了,請查看您的「for」循環,記得添加非反轉字符串。

public static String spinWords(String sentence) { 
    String[] splitWords = sentence.split(" "); 
    String reversedSentence = ""; 
    String reversedWord; 
    for (String str : splitWords) { 
     if (str.length() >= 5) { 
      reversedWord = ""; 
      for (int i = str.length() - 1; i >= 0; i--) { 
       reversedWord += (str.charAt(i)); 
      } 
      reversedSentence += " " + reversedWord; 
     } else { 
      reversedSentence += " " + str; 
     } 
    } 
    return reversedSentence; 
} 
0

使用StringBuilder爲您處理在splitWords元素打造的答案。

您也可能會發現space的成語具有特殊的首次值(「」)有用。

您的原始代碼中還存在一個錯誤。

因此,這裏是我會做什麼:

public class ReverseLongWord { 

    public static void main(String[] args) { 
     String testInput = "My name is Michael"; 

     System.out.println(spinWords(testInput)); 

    } 

    public static String spinWords(String sentence) { 
     String[] splitWords = sentence.split(" "); 
     String reversedSentence = ""; 
     StringBuilder sb = new StringBuilder(); 
     String space = "";    // first time special 
     String reversedWord = ""; 
     for (String str : splitWords) { 
      if (str.length() >= 5) { 
       for (int i = str.length() - 1; i >= 0; i--) { 
        reversedWord += (str.charAt(i)); // Bug fixed 
       } 
       sb.append(space + reversedWord); 
      } else { 
       sb.append(space + str); 
      } 
      space = " ";    // second time and onwards 
     } 
     return sb.toString(); 
    } 

} 

這個程序的輸出是下面的,因爲你已經指定:

My name is leahciM 
-1

我覺得相反的方法有些人建議將是最簡單的方法,在這裏我分享我的實施

public static void main(String[] args) { 
    System.out.println(concatenatePhrase("My name is Michael")); 
    System.out.println(concatenatePhrase("Some randoms words with differents sizes and random words")); 
} 

private static String concatenatePhrase(String phrase) { 
    StringBuilder completePhrase = new StringBuilder(); 
    String[] phrases = phrase.split(" "); 
    for (String word : phrases) { 
     if (word.length() >= 5) { 
      completePhrase.append(reverseWord(word).append(" ")); 
     } else { 
      completePhrase.append(word).append(" "); 
     } 
    } 
    return completePhrase.toString().trim(); 
} 

private static StringBuilder reverseWord(String wordPassed) { 
    StringBuilder word = new StringBuilder(wordPassed); 
    return word.reverse(); 
}