一、智者说:无聊的时候来几道算法题,可以训练训练自己的思维嘛!难怪之前人家说数学好的人编程起来事半功倍,写算法的过程中真是深有体会啊!感觉就像是在做大学的高数题......本博文仅用来记录自己学习算法的历程,不定时更新。参考自《编程之美》,加上些自己的理解。有啥不对的地方,还请大家不吝指教!

二、求二进制数中1的个数(对于一个字节(8bit)的变量,求其二进制中"1"的个数,要求算法的执行效率尽可能高)

public class One
{public static void main(String[] args){int v = 0b10101010;System.out.println(count(v));System.out.println(count2(v));System.out.println(count3(v));}/*解法一:对于2进制来说,把他除以2就是向左移了一位,余数为0,代表最后一位为0。余数为1,代表最后一位为1*/public static int count(int v){int count = 0;while (v != 0) {if (v % 2 == 1) {count++;}v = v / 2;}return count;}/*解法二:使用位操作,每次向右移动1位,即抛弃一位。跟00000001进行与运算判断是否为1*/public static int count2(int v){int count=0;while (v!=0){count += v & 0B00000001;v=v>>1;}return count;}/*解法三:前面两种解法的时间复杂度都是O(log2n),通过二进制数每次和(二进制-1)进行与运行,都会使二进制中少了一个1*/public static int count3(int v){int count=0;while (v!=0){v=v&(v-1);count++;}return count;}/*拓展题:给定两个正整数(二进制表示的A和B),请问把A变成B需要改变多少位?也就是说A和B的二进制表示中有多少位是不同的* 原理:* 1. A & B,得到的结果C中的1的位表明了A和B中相同的位都是1的位;* 2. A | B, 得到的结果D中的1的位表明了A和B在该位至少有一个为1的位,包含了A 与 B 都是1的位数,经过前两步的位运算,,C 中1的位表明了A 和 B在该位都是1,D中为0的位表明了A 和 B 在该位都是0 ,所以进行第三步。* 3. C ^ D,E 中为1的位表明了A 和 B不同的位。* */public static int diff(int A,int B){int sum=0;int C = A & B;int D = A | B;int E = C ^ D;sum=count2(E);return sum;}}

2017.09.01

三、1、给定一个整数N,那么N的阶乘N!末尾有几个0呢?

2、求N!的二进制表示中最低位1的位置

public class Two
{public static void main(String[] args){System.out.println(count(27));System.out.println(count2(27));System.out.println(count3(27));}
/*问题一的解法一
* 解答思路:N!=K*10^m(m>=0),那么m的个数就是末尾0的个数。
*         N!=2^x * 3^y * 5^z * 7^n…… 不可否认任何一个数都可以这样分解开来,其中这个因式分解中
*         2^x * 5^z 能够组成多少10^m的数,取决于min(x,z)。想想就知道被2整除的频率比被5整除的频
*         率高多了,所以只要计算N!因式分解中5的指数。
* */public static Integer count(final int N){int sum=0;for(int i=1;i<=N;i++){int j=i;while(j % 5==0){sum++;j/=5;}}return sum;}/*问题一的解法二*解题思路:Z=N/5 + N/5^2 + N/5^3……(不用担心这会是一个无穷的运算,因为总存在一个K,使得5^k>N,则 N/5^k=0)* 公式中,N/5表示不大于N的数中5的倍数贡献一个5,N/5^2 表示不大于N的数中5^2的倍数再贡献一个5.**         上面是《编程之美》的解释?反正我没看懂,下面说一下个人见解:*         比如 一个数 26 那么 26 / 5= 5 表示26的阶乘里面有 5 10 15 20 25 五个数可以贡献 5*                            26 / 25=1 表示25的阶乘里面有 25 可以贡献 5 ,所以25 又贡献了一次* */public static Integer count2(int N){int sum=0;while (N!=0){sum+=N/5;N=N/5;}return sum;}/*问题二的解法* 这么理解:二进制除以2相当于向左移了一个小数点(参照10进制除以10),余数为0表示可以被除断,*         为1表示有余数不能被除断。所以 求N!的二进制表示中最低位1的位置,就可以求最低位1*         后面有几个零,把他加1 就可以了。*         而 1 后面有几个零,取决于N!中2的个数,因为每存在一个2,则在数的最低位多1个0* */public static Integer count3(int N){int sum=0;while (N!=0){N = N >> 1;//相当于N=N/2sum+=N;}return  sum+1;}
}

2017.09.01

四、传说,Tango有一大“水王”,他不但喜欢发帖,还会回复其他ID发的帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上的帖子(包括回帖)的列表,其中帖子作者的ID也在其中,你能快速找出这个传说中的Tango水王吗?

public class Three
{public static void main(String[] args){Tango[] tangos=new Tango[8];Tango tango=new Tango(1);Tango tango2=new Tango(2);Tango tango3=new Tango(3);tangos[0]=tango3;tangos[1]=tango;tangos[2]=tango;tangos[3]=tango2;tangos[4]=tango;tangos[5]=tango;tangos[6]=tango;tangos[7]=tango2;Tango tango1 = find(tangos);System.out.println(tango1);}/** 解题思路:原理:如果每次删除两个不同的ID(不管是否包含“水王”的ID),那么,在剩下的ID列表中,“水王”ID出现的次数*                仍然超过次数的一半。**                这里的解题思路是先把tangos数组中的第一个假设成“水王”tango,如果tangos第二个与第一个不一样,*                就不管这两个了,然后把第三个再假设成“水王”,如果第四个ID和第三个一样,那么nTiames就变成了2,*                也就是说,数组后面至少要有两个与现在假设的ID不一样,才会引起tango的重新赋值,而这样一直到最少,*                剩下的就是那个“水王”了。**                当然,你也可以对数组排序,那么N/2 位置的就一定是“水王”了(因为"水王"出现的次数超过了总数的一半)* */public static Tango find(Tango[] tangos){Tango tango=null;int nTiames=0;for (int i=0;i<tangos.length;i++){if (nTiames==0){tango=tangos[i];nTiames=1;}else {if (tango.equals(tangos[i])){nTiames++;}else {nTiames--;}}}return tango;}/*扩展题:随着Tango的发展,管理员发现,“超级水王”没有了。统计结果说明,有三个发帖很多的ID,他们的发帖数目*         都超过了帖子宗数目的N的1/4。你能从发帖ID列表中快速找出他们的ID吗?* */public static Tango[] find2(Tango[] tangos){if (tangos==null) return null;Tango tango=null,tango1=null,tango2=null;int num1=0,num2=0,num3=0;int len=tangos.length;for (int i=0;i<len;i++){if(num1==0 && tangos[i]!=tango1 && tangos[i]!=tango2){tango=tangos[i];num1++;}else if (num2==0 && tangos[i]!=tango && tangos[i]!=tango2){tango1=tangos[i];num2++;}else if (num3==0 && tangos[i]!=tango1 && tangos[i]!=tango2){tango2=tangos[i];num3++;}else if (tangos[i]!=tango && tangos[i]!=tango1 && tangos[i]!=tango2){num1--;num2--;num3--;}else if (tangos[i]==tango){num1++;}else if (tangos[i]==tango1){num2++;}else if (tangos[i]==tango2){num3++;}}Tango[] result={tango,tango1,tango2};return result;}
}

2017.09.05

转载于:https://www.cnblogs.com/jmcui/p/7464300.html

学习思考之《编程之美》.相关推荐

  1. 有一种美叫做思考——《编程之美》书评

    原帖地址:http://book.douban.com/review/2615021/ 原帖作者:Invisible 某日,同学问了我一道题,如何判断两个链表是否相交.我毫不犹豫地回答,遍历两个链表, ...

  2. 《编程之美》学习笔记

    师兄留下了<编程之美>,今天翻开之后,打算开始学习,为下步工作准备: 先记下几句话吧: 1.题目关键不在于答案,在于思考问题的方法. 2.微软职位:1AR 协助研究员2,DEV 软件开发工 ...

  3. java语言就业方向_四大就业方向彻底解决你学习Java语言编程的后顾之忧-生活感悟与随笔 -亦是美网络...

    前面的文章中已经给大家介绍了关于Java编程语言的优势.特点以及就业前景等内容,大家之所以这么热衷于Java编程学习,不仅是因为Java是编程市场上最为广泛流行的语言,大家更关心的是学习了Java编程 ...

  4. 让多核CPU占用率曲线听你指挥(Windows实现)——《编程之美》1.1学习笔记

    让多核CPU占用率曲线听你指挥--<编程之美>1.1学习笔记 Problem: 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.有以下几种情况: ...

  5. 编程之美 - 孟岩点评

    这是一本让人着迷的书! 从我得到样书的那一刻起,在每天的闲暇时间阅读和思索这本书中的题目就成了我的一个新习惯.虽然网络上 早就流传着不少微软面试题,坊间也不乏一些程序员面试类的图书,但是像这样集中展示 ...

  6. 由《编程之美》想到的

    由<编程之美>想到的 昨天下班,约了搜狐的同学,一起去海淀图书城淘宝. 目标就是MS的这本<编程之美>,这本书名字比较吸引人,副标题叫做:微软技术面试心得 在dangdang上 ...

  7. 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!

    这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书."    ...

  8. 《Java并发编程之美》

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAwEsYPZ-1661534116043)(img/\1625573175405.jpg)] [外链图片转存失败,源站 ...

  9. 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!...

    这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书." -- ...

最新文章

  1. 【教程】Linux 系统下对目录扩容的方法
  2. php获取当天的日期-年月日与星期几
  3. Smart Template component rendering process - part 2
  4. 美国防部DARPA发起地下空间挑战赛提供3百万美元巨奖
  5. java nextgaussian(),java.util.Random.nextGaussian()
  6. 大数据之-Hadoop3.x_MapReduce_排序概述---大数据之hadoop3.x工作笔记0114
  7. iOS学习笔记之正则表达式
  8. 90后黄金程序员,你不是码农,请自信
  9. win11笔记本没有网络图标问题的解决历程
  10. 最热BMS可直接下载!!
  11. google 身份验证器 谷歌服务器,整整10年!谷歌身份验证器终于带来数据转移服务 不用挨个解绑取消啦...
  12. 如何低成本,有效地进行企业公众号拉新,获取10万+潜在用户? 黎想
  13. fx3u4ad一adp说明书_FX3U-4AD-ADP使用案例三菱FX3U-4AD-ADP硬件手册 - 广州正凌
  14. 相忘于江湖——记另一位朋友
  15. 迁移数据到历史表SQL
  16. 三天打鱼,两天晒网问题
  17. 农产品电商app开发的主要价值与功能分析
  18. 无线显示但是无法上网络连接服务器,无线已连接上但还是不能上网该怎么处理...
  19. AMD 硬解码开发(四)之边摸索边编译samples
  20. 腾讯应用宝 - 微下载

热门文章

  1. 网站前端开发基础知识学什么?必备技能
  2. HTML5和Web前端有什么区别?具备HTML5技能的人薪资多少?
  3. adb命令查看手机电量_desired Capabilities和aapt命令查看手机包信息
  4. 服务器 自检 修改,检查多台服务器初始密码是否修改的shell脚本
  5. python operator 多属性排序_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)你能打几分?...
  6. mongodb连接池 php,node.js,mongodb_nodejs使用mongodb连接池,node.js,mongodb - phpStudy
  7. 重庆计算机考试准考证打印入口,重庆西南大学计算机等级考试准考证打印入口...
  8. 减少上下文切换和避免死锁简述
  9. 数字图像识别笔记(第一章绪论)
  10. Tensorflow 卷积神经网络(三)池化与采样