第2次实验——算法基本功 与 综合思考

1、Google经典算法面试题

1)1024! 末尾有多少个0?

解:

 求末尾0个数,也就是对1024!进行因子分解,求因子中10的个数。在进一步,因子中10的个数,就相当与质因子     中2*5的个数。因为质因子5的个数比2少,所以也就是求1024!中质因子5的个数。

  1,2,3,…,1024中哪些数都含有质因子5?主要有以下几类:

  第一类:5的倍数,1024/5 = 204个;

  第二类:25的倍数,1024/25 = 40个;

  第三类:125的倍数,1024/125 = 8个;

  第四类:625的倍数,1024/625 = 1个;

  则,总的因子5的个数:204 + 40 + 8 + 1 = 253,即1024!末尾有253个0。


(2)判断一个自然数是否是某个数的平方。说明:当然不能使用开方运算。

解:

方法一:从1开始逐个尝试,即判断1*1,2*2,3*3…,算法复杂度O( N^0.5 )

方法二:相当于在1…N之间找一个数x,使x*x = N。相当于一个查找问题,所以用折半查找。算法复杂度O( logN )。

方法三:使用完全平方数的性质:每个完全平方数都可以表示成一系列奇数的和。

不妨这样简单理解一下:

设x是一个完全平方数,即 x = a^2,所以

a^2 = ( a – 1 +1 )^2 = (a-1)^2 + 2( a – 1 ) + 1

        =( (a-2) + 1 )^2 + 2( a – 1 ) + 1

        =(a-2)^2 + ( 2( a – 2 ) + 1 ) + (2( a – 1 ) + 1 )

即 x = 1 + 3 + 5 + … + (2( a – 1 ) + 1 )

故x可以表示为一系列奇数的和. 

因此判断完全平方数的算法:x – 1 – 3 – 5…即从x中连续不断的减去一个奇数,如果结果可以为0,则x是完全平方数。否则,不是。算法复杂度O(N )。


(3)有5个海盗,按照等级从5到1排列,最大的海盗有权提议他们如何分享100枚金币。但其他人要对此表决,如果多数反对,那他就会被杀死。他应该提出怎样的方案,既让自己拿到尽可能多的金币又不会被杀死?

(提示:有一个海盗能拿到98%的金币)

解:

         当有5个人时,等级为5的海盗,等级最高,他来分配。分配时要考虑两个问题:利益最大、不被杀死。至于他的分配方案会不会招来杀身之祸,完全取决于其他4个人的反应。所以考虑,4个人的情况。

       当有4个人时,等级为4的海盗,等级最高,他来分配。至于他的分配方案会不会招来杀身之祸,完全取决于其他3个人的反应。所以考虑,3个人的情况。

        …...

       当有2个人时,等级为2的海盗,等级最高,他来分配。这时他就可以肆无忌惮的分配了。分配方案:100,0。即给自己100枚金币,给等级为1的海盗0枚金币。虽然对等级为1的海盗来说很不公平,但是他反对也没用,因为只有两个人,他占不了大多数。

       再来考虑三个人的问题。当有3个人时,等级为3的海盗,等级最高,他来分配。他只要在前两个人中争取一个人就行。分配方案:99,0,1。这样等级为1的海盗肯定不会反对,因为比2个人的时候分的多。只有等级为2的海盗反对,但是没有用。

       考虑四个人的情况。分配方案:99,0,1,0。等级为4、2的海盗满意。

       五个人的情况。分配方案:98,0,1,0,1。


2、实习与工作

 结合我大学三年来的学习经历,我觉得自己感兴趣的岗位名称为

①JAVA开发工程师

职位信息工作性质:全职 
工作地点:广州 
工作经验:1-2年 
学  历:大专及以上 
其他待遇:在职培训、社保、年假、项目提成等 

1、计算机及相关专业毕业,具有2年以上商业软件或APP开发经验优先
2、2年以上Java编程经验,熟悉J2EE架构和开发模式;掌握jsp/javascriptml等脚本语言的编程,掌握1种以上常用J2EE项目开发工具,如JBuilder 或Eclipse。同时熟悉C语言或PHP开发任一种可优先
3、熟练掌握一种及以上常用数据库,如SQL Server、PostgreSQL、Mysql数据库 
4、具备系统的软件工程的知识和实践经验,有良好的编程及文档习惯。 
5、具备较强的学习能力和解决问题的能力。
6、具备强的责任心和团队合作精神。


②Android开发工程师

岗位职责:

1.负责手机客户端软件产品程序设计和开发

2.参与产品开发计划的制定并跟踪执行

3.参与代码编写和测试,编写相关技术文档

任职要求:

1、计算机相关专业,本科以上学历;

2、精通Java语言,有一年以上实际Android项目开发经验。

3、精通Android界面UI的开发,熟悉Android应用开发框架,能独立开发高性能的Android应用; 

4、熟悉Java的多线程编程,熟悉Android下线程与线程,进程与进程间的通信机制; 

5、熟悉Linux,熟悉Socket TCP/IPUDP网络编程技术。

6、熟悉HTTP/SIP协议等相关技术,有视频、GIS开发经验优先。

7 积极主动、认真踏实、有良好的沟通能力和团队合作精神。


       看了这两个岗位的招工要求,我深深叹了一口气,自己三年来学的都是一些基本概念,而且学的都是课本上的东西,几乎没有课本以外的知识。对于这些公司要求掌握的东西,虽然很多都接触过,不过也是一些皮毛而已,更不要说是精通了,感觉自己还要学的东西还有很多很多,我想利用大三暑假的时间找一份相关的实习,去锻炼自己的实践能力。剩下的只有大四一学期的时间,我想找几个志同道合的同学一起做项目,锻炼一下团队合作的能力和动手实践的能力,另外对于一些基本功还不扎实的科目,我会更加重视,争取每天找一道编程题目做,提前适应工作的模式,弥补自己在这方面的不足。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值