1

我试图将一根弦插入另一根弦的中间,然后放入Monkey新弦的中间。

String One = "MonkeyPony";
String Two = "Monkey";

基本上我想要做的是插入"Monkey"到无数次的中间"MonkeyPony",所以第一次它会"MonkeMonkeyyPony"在第二次读取"MonkeMonMonkeykeyyPony",等等。

4

4 回答 4

4

使用 StringBuilder:

StringBuilder builder = new StringBuilder(One);
for (int i = 0; i < 10; ++i) {
  builder.insert(builder.length() / 2, Two);
  System.out.println(builder.toString());
}
于 2013-03-15T23:21:37.973 回答
0

这个解决方案可能很简单,但是与其他解决方案相比,它会消耗大量时间。
这里使用了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);
         }


        }


}
于 2013-03-16T20:04:34.087 回答
0

我不知道这个问题是来自你的实际工作还是家庭作业/面试算法问题。

直接的解决方案是计算原始字符串的索引,将新字符串插入该位置。这样做 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's answer复制)

@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 
于 2013-03-15T23:43:09.170 回答
0

你可以试试这个:

One = One.substr(0,One.length()/2)+Two+One.substr(One.length()/2+1, One.length();

字符串连接中的第一个元素取字符串 One 的前半部分,然后用单词 Two 连接,然后添加其余部分。

于 2013-03-15T23:12:19.040 回答