我试图将一根弦插入另一根弦的中间,然后放入Monkey
新弦的中间。
String One = "MonkeyPony";
String Two = "Monkey";
基本上我想要做的是插入"Monkey"
到无数次的中间"MonkeyPony"
,所以第一次它会"MonkeMonkeyyPony"
在第二次读取"MonkeMonMonkeykeyyPony"
,等等。
我试图将一根弦插入另一根弦的中间,然后放入Monkey
新弦的中间。
String One = "MonkeyPony";
String Two = "Monkey";
基本上我想要做的是插入"Monkey"
到无数次的中间"MonkeyPony"
,所以第一次它会"MonkeMonkeyyPony"
在第二次读取"MonkeMonMonkeykeyyPony"
,等等。
使用 StringBuilder:
StringBuilder builder = new StringBuilder(One);
for (int i = 0; i < 10; ++i) {
builder.insert(builder.length() / 2, Two);
System.out.println(builder.toString());
}
这个解决方案可能很简单,但是与其他解决方案相比,它会消耗大量时间。
这里使用了substring方法。
import java.util.Scanner;
public class test {
public static void main(String[] args) {
int n=0;
String str1,str2=null;
Scanner in = new Scanner(System.in);
System.out.println("Enter the String1.!");
str1=in.nextLine();
System.out.println("Enter the String2.!");
str2=in.nextLine();
System.out.println("Enter the Count.!");
n=Integer.parseInt(in.nextLine());
in.close();
for(int i=0;i<n;i++)
{
//Concept: Say str1=TEST str2=123, Now the below code will do this TE + 123 + ST
str1=str1.substring(0,str1.length()/2) + str2 + str1.substring(str1.length()/2);
System.out.println(str1);
}
}
}
我不知道这个问题是来自你的实际工作还是家庭作业/面试算法问题。
直接的解决方案是计算原始字符串的索引,将新字符串插入该位置。这样做 n 次。
我只是写一个想法,不确定是否可以:说我们想做插入100(n)次
Monkey
"Mon"
重复 99 次 (n-1),另一个是"key"
,也重复 99 次i
i
位置:99Mons + String TWO("Monkey") + 99keys
我不确定这是否是一个好方法......
我对我的解决方案的性能很好奇,所以我用@Ame Burmeister 的简单解决方案做了一个小的性能测试。
在我的测试中:
Junit Test class
StopWatch
来自番石榴warming up
测量经过时间前 4 次,以避免Jit
100000
插入测试@Test
public void insertWithBuilder() {
final int n = 100000;
final String one = "MonkeyPony";
final String two = "Monkey";
final Stopwatch sw = new Stopwatch();
int x = 1;
for (; x <= 5; x++) {// loop 4 times (warming up) to avoid JIT
if (x == 5) {
sw.start();
}
final StringBuilder builder = new StringBuilder(one);
System.out.println("warming up times:" + x);
for (int i = 0; i < n; ++i) {
builder.insert(builder.length() / 2, two);
}
if (x == 5) {
sw.stop();
// System.out.println("builder:" + builder.toString());
}
}
System.out.println("SBuilder:" + sw.elapsedTime(TimeUnit.MILLISECONDS));
}
@Test
public void insertWithRepeatString() {
final int n = 100000;
final String one = "MonkeyPony";
final String two = "Monkey";
final Stopwatch sw = new Stopwatch();
int x = 1;
for (; x <= 5; x++) { // loop 4 times (warming up) to avoid JIT
System.out.println("warming up times:" + x);
if (x == 5) {
sw.start();
}
final StringBuilder builder = new StringBuilder(one);
final int m = two.length() / 2;
final String h1 = two.substring(0, m); //get Mon
final String r1 = two.substring(m); //get Key
final String head = new String(new char[n - 1]).replace("\0", h1); //build repeat string
final String tail = new String(new char[n - 1]).replace("\0", r1); //build repeat String
final StringBuilder builder2 = new StringBuilder(head);
builder2.append(two).append(tail);
builder.insert(builder.length() / 2, builder2);
if (x == 5) {
sw.stop();
// System.out.println("builder:" + builder.toString());
}
}
System.out.println("Idea:" + sw.elapsedTime(TimeUnit.MILLISECONDS));
}
warming up times:1
warming up times:2
warming up times:3
warming up times:4
warming up times:5
Idea:41
warming up times:1
warming up times:2
warming up times:3
warming up times:4
warming up times:5
SBuilder:4413
你可以试试这个:
One = One.substr(0,One.length()/2)+Two+One.substr(One.length()/2+1, One.length();
字符串连接中的第一个元素取字符串 One 的前半部分,然后用单词 Two 连接,然后添加其余部分。