很多大型的的公司在面试Java工程师的时候都会先笔试。下面是新浪Java工程师面试的一些题目,希望能帮你在笔试中脱颖而出。
有这么一段程序:
String a=new String("a");
String b="b";
String c=a+b;
StringBuffer strBuf=new StringBuffer();
strBuf.append("a");
strBuf.append("b");
String d=strBuf.toString();
StringBuilder strBuilder=new StringBuilder();
strBuilder.append("a");
strBuilder.append("b");
String e=strBuilder.toString();
请问以上程序片段中c、d、e的字符串的创建各有什么不同?
------答案--------------------
c和e创建过程是一样的. 都是采用了StringBuilder
d采用了StringBuffer
有一个大小为2G的文件,存储微博里的粉丝关系。文件有两列,每列都是一个整型数。如某一行的两列分别为:123456 654321。
则代表id为654321的用户是id为123456的用户的粉丝。如果用户123456又是654321的粉丝,则称这两个用户互粉。
要求找出文件里所有的互粉用户。
对这个问题没有实现思路?主要是问问各位大牛 java来实现的思路
1 有一个大小为2G的文件 去掉这一句的,也就是用普通大小的文件, 如何来实现?
2 加上 有一个大小为2G的文件 这个限制 我们又该如何去设计和优化?
------解决方案--------------------
引用:
第一点:
读取出来 用一个MAP存储,遍历 map,对于每一个 如果有 map.get(key) = value;map.get(value) = key;那么这两个互粉。然后保存到另一个数组或list什么的面里,移除这个key值,继续下一条。直到完成。另外存储的数组或list里面的就是有互粉的
互粉的话,应该是两条记录。
不知道这样行不:
1. 用List strList存一行记录,String格式要求为:a b
(a、b表示两个用户,以空格分隔。)
2. 每读取一行就拼装String strTmp="a b"和String strReverse="b a",若strReverse在strList中存在,则说明a b为互粉用户,记录到List fenList中,并且strList.remove(strReverse);
3. 若strReverse在strList中不存在,则 strList.add(strTmp);
极限情况下,所有人都不互粉,如果内存不够的话,可能需要做个数据库来辅助存储下strList的数据了(当然,直接使用数据库也是一种思路)。
------解决方案--------------------
2G只是一个大小的概念,它可能是4g,20g,200g,所以把一个nG的大文件拆分成小文件。这样比单纯依靠内存的方式更具有适应性和扩展性(PS:我处理过最恶心的文件有52G大,接手的时还以为自己看错了。)
hash是比较常见的办法,但是因为有互粉,单纯针对一个id做分段,很可能互粉的两条记录被拆到不同的文件里去。
既然id是整数,简单的办法是把两个id相加得到一个值idres,互粉的两条记录idres必然是相同的。
现在可以针对idres做一致性hash了,然后把2g的文件,写入n个小文件(比如1m)里,并且互粉的两条数据必然在同一个文件里。
现在无论用性能好或坏的算法,都无所谓了,重复而且固定量的小数据处理,把互粉的用户选出来。
这么做的好处是:
1. 最坏情况下性能可靠。
也就是说无论文件中互粉的两个用户间隔多远,互粉查询算法有多差(这一步也许是个新手来完成的),运算性能不会有明显的问题。
2. 运行时资源需求低
拆分文件只是一个输入输出流,照抄网上的读文件,那么源文件也就占用一个缓冲区。
3. 扩展性好
源文件大小变化再大,都适用这个设计。
缺点:
1. 文件拆分会造成大量的io操作
2. 理想条件下,花费时间不如特定的算法
------解决方案--------------------
可以用数据库不
create table fans(
id number(6),
fansid number(6));
select * from fans a,fans b where a.id=b.fanid and a.fanid=b.id;
虽然笔试很重要,但一个好的面试问题能使应聘者的本性显露出来——诚实,可信,反应敏锐等等。以下功课在任何面试前都需要准备,以帮助你应对上述绝大多数问题。
准备十分简洁的自我描述:以便在任何面试中都可以用。最好的技巧是提到自己与众不同甚至独一无二的地方,同时兼顾不突出或(最坏的话)中庸之处——保留自己的缺陷,除非它和一个重要的优点有关联。连续的三十秒陈述即可。
研究公司:通过访问他们的网页了解他们究竟做些什么。最好阅读公司近些年的年度报告和它在维基上的描述(如果它足够大),或者用Google搜索公司名字和地点(如果是小公司)。如果它处于起步阶段,找尽可能多的资料,如果相关资料实在太少,就别再多花精力了。
研究职位:认真阅读招聘启事,对任何不懂之处都要查阅。如果还不甚熟悉,你还必须让自己深入阅读招聘启事以让自己清楚这一领域的重要信息何在——从博客和新闻网页开始是不错的选择。你还应该在生活范围附近调查一下类似工作,以对这类工作的常规起步工资心中有数。
了解自己适合这一职位的原因:收集你能找到的公司信息和招聘启事,将它们与自己的技能作对照。这样做五份,它们在面试中会有奇效。同时,找出至少一项自己对公司或职位不满之处然后思考为什么这使你不满。
不断努力提升工作技能:参与能使你提高相关领域关键技能的活动。任职人际关系领域吗?加入一个主持人协会;任职行政助理吗?加入为某个机构服务的志愿工作,以不同方式锻炼你的能力(同样适用于从事贸易者);任职程序员吗?那就为一项开源项目作点贡献。
在头脑中储备一些对应聘职位的问题:当你进入面试室。这能给人一个强烈的印象,说明你确实对那个职位感兴趣,这将大有益处。各类问题都可以,但最好涉及工作中的协作文化和特定技术。
千万不要抱怨之前的工作:如果先前的工作中确实有让你懊恼之处,花些时间试着想想它的积极方面。要知道面试时先前工作至少在某种程度上会被提及,因此准备好不带消极情绪谈论它,寻找积极因素,同时尽可能冷静陈述离职理由。
阅读(615) | 评论(0) | 转发(0) |