我不知道这个问题是来自你的实际工作还是家庭作业/面试算法问题。
直接的解决方案是计算原始字符串的索引,将新字符串插入该位置。这样做 n 次。
我只是写一个想法,不确定是否可以:假设我们要插入 100(n) 次
- 首先我们取字符串二,
Monkey
- 构建两个字符串,一个是
"Mon",重复99次(n-1),另一个是"key",同样重复99次
- 找出字符串ONE的插入索引,比如
i
- 将此字符串插入
i 位置:99Mons + String TWO("Monkey") + 99keys
我不确定这是否是一个好方法......
做了一个小测试:
我对我的解决方案的性能很好奇,所以我用@Ame Burmeister 提供的简单解决方案做了一个小的性能测试。
在我的测试中:
- 使用
Junit Test class 完成测试
-
StopWatch 来自番石榴
-
warming up 测量经过时间之前的 4 次,以避免 Jit
- 这两种方法的输出相同(n 更小),均已正确实现。
- 均使用
100000 插入测试
简单的解决方案(基本上只是复制@Ame的答案)
@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