颠倒字符串中的某些字
问题描述:
我需要在给定的字符串中颠倒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 &作为对计算器。
答
您可以使用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();
}
有没有办法在最后删除该空间?我真的很喜欢你的方法,而不起诉StringBuilder(我不认为我可以在codewars上使用额外的库)。 – doublemc
@doublemc *“您可以将所有单词放回循环中的列表,并在循环后*调用reversedSentence = String.join(”“,list)*或使用String#trim()检查其他答案' –
m0skit0
@doublemc一个诀窍是在你的循环中有一个'boolean firstWord = true':'if(firstWord){result = str; firstWord = false; } else {result + =“”+ str; }' – assylias