杭州淘宝的阿里巴巴的一个j2ee题目 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());不知道其他人如何考虑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在坛子里看到过好多次 阿里巴巴和一些大公司的面试题了!真晕 为什么面试的是j2ee的工程师 总是考一些算法的题呢!本人是菜鸟 尤其是算法方面!但是 我总是觉得现在在工作中一般的公司中算法真的很重要么! 我们一般做的就是把sun或者是别人写好的封装起来的算法用的熟练熟练再熟练!能提高开发的效率 不就行了么! 难不成还真的要我们去做出一些效率巨高的算法实现么?那我们学java的都去学c 学算法 算了!为什么那么多的打公司都要考比较变态的算法题(当然我并不是说阿里巴巴考的变态,只是现在好像成了大公司的“通病”了!)真是搞不懂! for(int i = 1; i <= 20000/5; i++) { sb.append("aaaaa"); // 哈哈哈哈哈} 这个程序 其实是 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);} 用递归调用....1. aaaaa2. aaaaa aaaaa3. aaaaaaaaaa aaaaaaaaaa4. aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa5. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....n. aaaaaaaa..............(从字符串1 累加到 n 为 20000个"a")显然是道数学题: 假设 a = 5, 也就是题目中对应的 "aaaaa" 的长度 a + 2*a + 4*a + 8*a + .... = 20000也就是找出这个行列式的数学通用表达式, 然后使用递归算法就能解决... 很显然 这个行列式的通式是 2^(n - 1) * a .. ok~ 这样应该会有比较好的效率 2000000 个a相加2 普通一个一个加 加起来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 由此可以粗略地看出 这样的答案..应该是递归会好点...不过还可以考虑 先一个一个加..加一段之后..再递归..或许效果更好... 有兴趣的可以试验下... 用得着循环这么多次吗?看下我的: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++;} spring+xfire问题 求救,jetty7入门级问题 lucene 在某一时间段内做多条件查询 啥问题呢?? Java做的bs项目中有个更新模块应该怎么做 执行动态action方法时候不能自动通过setter方法给字段赋值 为什么我的MyEclipse装上去用不了? 一个关于JSF奇怪的问题! 为何两个程序输出的结果会不一样?谢谢!!!! 100 分求 J2EE设计开发编程指南 JSP+CSS+DVI 下拉菜单残影 在用hibernate tools,对表reverse engineering向导的时候,dao type中无法再选择spring dao。(图)
真晕 为什么面试的是j2ee的工程师 总是考一些算法的题呢!
本人是菜鸟 尤其是算法方面!但是 我总是觉得现在在工作中一般的公司中算法真的很重要么! 我们一般做的就是把sun或者是别人写好的封装起来的算法用的熟练熟练再熟练!能提高开发的效率 不就行了么! 难不成还真的要我们去做出一些效率巨高的算法实现么?那我们学java的都去学c 学算法 算了!
为什么那么多的打公司都要考比较变态的算法题(当然我并不是说阿里巴巴考的变态,只是现在好像成了大公司的“通病”了!)
真是搞不懂!
sb.append("aaaaa"); // 哈哈哈哈哈
}
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);
}
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~
这样应该会有比较好的效率
2
普通一个一个加 加起来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 由此可以粗略地看出 这样的答案..应该是递归会好点...不过还可以考虑 先一个一个加..加一段之后..再递归..或许效果更好...
有兴趣的可以试验下...
看下我的:
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++;
}