博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
笔试算法题(34):从数字序列中寻找仅出现一次的数字 & 最大公约数(GCD)问题...
阅读量:5919 次
发布时间:2019-06-19

本文共 1386 字,大约阅读时间需要 4 分钟。

出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字;

分析:

  • 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它本身,所以当所有的数字序列都异或操作之后,所有出现两次的数字异或操作之后的结果都为0,则最后剩下的结果就是那个仅出现了一次的数字;
  • 如果有多个数字都仅仅出现了一次,则上述的异或操作方法不再适用;如果确定只有两个数字只出现了一次,则可以利用X+Y=a和XY=b求解;

解题:

1 int findSingleInt(int *array, int length) { 2         int result=0; 3         for(int i=0;i

 

出题:求两个正整数的最大公约数,如果正整数较大,该如何处理;

分析:

  • 辗转相除法:gcd(x,y)=gcd(y,x%y),直到较小一个数(y%x)为0,此时的y就为最大公约数。对于大整数而言,取模运算(%)开销较大 (用到除法),所以不适合计算较大整数间的GCD,注意到既然y与x%y的gcd等于x和y的gcd,那么x-y与y的gcd同样等于x和y的 gcd,gcd(x,y)=gcd(x,x-y)这样就可以避免除法操作,但经历更多的循环,同样需要保证x>y;
  • 另外还有一个终极解法:使用移位操作和减法操作替代除法。
    首先,如果y=k*y1, x=k*x1,则有gcd(y, x)=k*gcd(y1, x1)
    然后,如果x=p*x1, y%p!=0,p是素数,则有gcd(x, y)=gcd(x1, y)
    所以当p=2的时候
    如果x和y都是偶数,gcd(x, y)=2*gcd(x>>1, y>>1)
    如果x为偶数,y为奇数,gcd(x,y)=gcd(x>>1, y)
    如果x为奇数,y为偶数,gcd(x, y)=gcd(x, y>>1)
    如果x和y都是奇数,gcd(x, y)=gcd(x, x-y),x-y必然会是偶数

解题:

1 int gcd1(int x, int y) { 2         return (y==0) ? x:gcd1(y,x%y); 3 } 4  5 int gcd2(int x, int y) { 6         if(x
> 1, y >> 1) << 1);23 else24 return gcd3(x >> 1,y);25 } else {26 if(y%2==0)27 return gcd3(x,y >> 1);28 else29 return gcd3(y,x-y);30 }31 }32 }

 

转载于:https://www.cnblogs.com/leo-chen-2014/p/3751173.html

你可能感兴趣的文章
Node.js基金会官方的开发者认证准备就绪
查看>>
C#和F#默认接口方法更新
查看>>
唯品会HDFS性能挑战和优化实践
查看>>
微软把UWP定位成业务线应用程序开发平台
查看>>
Netflix 混沌工程手册 Part 3:实践方法
查看>>
Grafana 6.0正式发布!新增查询工作流,全新独立Gauge面板
查看>>
深入探索JVM自动资源管理
查看>>
Service Worker 全面进阶
查看>>
OpsRamp推出以服务为中心的AIOps和云监控功能
查看>>
区块链现状:从谨慎和批判性思维看待它(第二部分)
查看>>
51信用卡 Android自动埋点实践
查看>>
Oracle发布Oracle数据库的官方Node.js驱动node-oracledb
查看>>
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
Imperva开源域目录控制器,简化活动目录集成
查看>>
旷视砸20亿进军AIoT,发布国内首个机器人协作大脑河图
查看>>
如何对DevOps数据库进行源代码控制
查看>>
TensorFlow Lite支持设备内置会话建模
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
CLion 2016.1新增Python、Swift支持,并改进了C++支持
查看>>
敏捷团队的动机与驱动力
查看>>