颠倒字符串中的某些字

问题描述:

我需要在给定的字符串中颠倒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)我不知道如何将它们放回到他们在串

这地方是一个建议:

  • 编写反转字符串的方法:

    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

您可以使用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(); 
} 

无需使用任何你几乎拥有了,请查看您的“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; 
} 

使用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 

我觉得相反的方法有些人建议将是最简单的方法,在这里我分享我的实施

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