问题描述
给定一个字符串 s 和一个数字 n,编写一个函数,将偶数索引字符连接到前面,将奇数索引字符连接到后面,n 次。 示例:
- s = "哇的例子!"`
- result = "WwEapeo xml!"
Bellow 是我对这个问题的回答,现在我需要优化这个解决方案,使其在 O(n) 中运行。请大家帮忙。
public class main {
public static void main(String[] args) {
String wordToJumble = "Wow Example!";
Long numberOfTimes = 1L;
jumbledString( wordToJumble,numberOfTimes);
}
public static String jumbledString(String s,Long n){
StringBuilder sbEven = new StringBuilder();
StringBuilder sbOdd = new StringBuilder();
StringBuilder s2= new StringBuilder(s);
char[] word = s.tochararray();
if(n>0) {
while (n > 0) {
n--;
sbEven.setLength(0);
sbOdd.setLength(0);
for (int i = 0; i < word.length; i++) {
if (i % 2 == 0) {
sbEven.append(word[i]);
} else {
sbOdd.append(word[i]);
}
}
s2 = sbEven.append(sbOdd);
word = s2.toString().tochararray();
}
System.out.println(s2);
}else{
System.out.println(s2);
}
return s2.toString();
}
}
解决方法
只需逐个字符并在适当的地方添加到结果 sbEven
或 sbOdd
中。之后,append()
n 次得到结果字符串。您可以使用 charAt(int)
方法而不是将字符串转换为 char[]
。
该解决方案在 O(n)
中,但请注意,n
不是您的 numberOfTimes
。这是字符串的长度。
public static String jumbledString(String s,long n) {
StringBuilder sbEven = new StringBuilder();
StringBuilder sbOdd = new StringBuilder();
StringBuilder result = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0) {
sbEven.append(s.charAt(i));
} else {
sbOdd.append(s.charAt(i));
}
}
for (int i = 0; i < n; i++) {
result.append(sbEven);
result.append(sbOdd);
}
return result.toString();
}
或者没有第二个循环,您可以对 repeat()
使用 String
方法(我假设 n
是 long
):
return result.toString().repeat((int) n);
,
public class main {
public static void main(String[] args) {
String wordToJumble = "Wow Example!";
Long numberOfTimes = 9L;
jumbledString(wordToJumble,numberOfTimes);
}
public static String jumbledString(String s,Long n) {
StringBuilder sbEven = new StringBuilder();
StringBuilder sbOdd = new StringBuilder();
char[] word = s.toCharArray();
if (n > 0) {
for (int x = 0; x < n; x++) {
word = newJumble(word,sbEven,sbOdd);
}
}
System.out.println(word);
return word.toString();
}
private static char[] newJumble(char[] s,StringBuilder sbEven,StringBuilder sbOdd) {
sbEven.setLength(0);
sbOdd.setLength(0);
StringBuilder result;
for (int i = 0; i < s.length; i++) {
if (i % 2 == 0) {
sbEven.append(s[i]);
} else {
sbOdd.append(s[i]);
}
}
result = sbEven.append(sbOdd);
return result.toString().toCharArray();
}
}