StringBuffer sb = new StringBuffer();
System.out.println("The start " + System.currentTimeMillis());
for(int i = 1; i <= 20000; i++) {
sb.append("a");
}
System.out.println("The end" + System.currentTimeMillis());不知道其他人如何考虑

解决方案 »

  1.   

    在坛子里看到过好多次 阿里巴巴和一些大公司的面试题了!
    真晕 为什么面试的是j2ee的工程师 总是考一些算法的题呢!
    本人是菜鸟 尤其是算法方面!但是 我总是觉得现在在工作中一般的公司中算法真的很重要么! 我们一般做的就是把sun或者是别人写好的封装起来的算法用的熟练熟练再熟练!能提高开发的效率 不就行了么! 难不成还真的要我们去做出一些效率巨高的算法实现么?那我们学java的都去学c 学算法 算了!
    为什么那么多的打公司都要考比较变态的算法题(当然我并不是说阿里巴巴考的变态,只是现在好像成了大公司的“通病”了!)
    真是搞不懂!
      

  2.   

    for(int i = 1; i <= 20000/5; i++) { 
    sb.append("aaaaa"); // 哈哈哈哈哈
      

  3.   

    这个程序 其实是  x * y =20000 然后求 x + y 的最小值
    x+y 就是循环次数
    StringBuffer sb = new StringBuffer(); 
    for(int i=0;i<160;i++)
    {
        sb.append("aaaaa");
    }
    for(int i=0;i<125;i++)
    {
        sb.append(sb);
    }
      

  4.   

    用递归调用....
    1. aaaaa
    2. aaaaa aaaaa
    3. aaaaaaaaaa aaaaaaaaaa
    4. aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa
    5. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    .....
    n. aaaaaaaa..............(从字符串1 累加到 n 为 20000个"a")
    显然是道数学题:
      假设 a = 5, 也就是题目中对应的 "aaaaa" 的长度
      a + 2*a + 4*a + 8*a + ....  =  20000
    也就是找出这个行列式的数学通用表达式, 然后使用递归算法就能解决... 
      很显然 这个行列式的通式是  2^(n - 1) * a  .. 
    ok~  
      这样应该会有比较好的效率
     
      

  5.   

    2000000 个a相加

    普通一个一个加   加起来2000000个"a"
    差值:186
    普通一次加四个a  加起来2000000个"a"
    差值:74
    递归循环21下     加起来2097152个"a"
    差值:39分两次循环1600 1250  |  1500  1333 |  1400  1428   | 1410 1418
      差值       45     |     43      |      42       |    42
       根据两次new Date().getTime的差值计算出两次时间差
    为了保证精确..循环了100次 取平均值
               试验证明..递归速度最快...
    为了进一步证明..我用4 a个一加..
     用递归:也就是要递归调用19次  差值:41
          本人AMD400+CPU 4G内存...WIN XP系统 JDK1.6 由此可以粗略地看出 这样的答案..应该是递归会好点...不过还可以考虑 先一个一个加..加一段之后..再递归..或许效果更好...
               有兴趣的可以试验下...
      

  6.   

    用得着循环这么多次吗?
    看下我的:
    String s="aaaaa";
    StringBuffer sb = new StringBuffer(s);
    int i=5; // i用来计算当前字符串长度while(i<20000)
    {
     sb.append(sb); //让字符串成倍增加岂不更快
     i*=2;
    }i=20000-i/10;
    /*最后一次循环i超出了20000,对i实行还原操作i/2,再/5实现循环连接固定长度为5个a的字符串s来补足剩下部分*/int j=0;while(j<i)
    {
     sb.append(s);
     j++;
    }