笔试算法题(34):从数字序列中寻找仅出现一次的数字 & 最大公约数(GCD)问题
出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字;
分析:
- 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它本身,所以当所有的数字序列都异或操作之后,所有出现两次的数字异或操作之后的结果都为0,则最后剩下的结果就是那个仅出现了一次的数字;
- 如果有多个数字都仅仅出现了一次,则上述的异或操作方法不再适用;如果确定只有两个数字只出现了一次,则可以利用X+Y=a和XY=b求解;
解题:
int findSingleInt(int *array, int length) {
int result=;
for(int i=;i<length;i++)
result^=array[i];
return result;
}
int main() {
int array[]={,,,,,,,,,,};
printf("%d\n",findSingleInt(array,));
return ;
}
出题:求两个正整数的最大公约数,如果正整数较大,该如何处理;
分析:
- 辗转相除法: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必然会是偶数
解题:
int gcd1(int x, int y) {
return (y==) ? x:gcd1(y,x%y);
}
int gcd2(int x, int y) {
if(x<y)
return gcd2(y,x);
if(y==)
return x;
else
return gcd2(x-y,y);
}
int gcd3(int x, int y) {
if(x<y)
return gcd3(y,x);
if(y==)
return x;
else {
if(x%==) {
if(y%==)
return (gcd3(x >> , y >> ) << );
else
return gcd3(x >> ,y);
} else {
if(y%==)
return gcd3(x,y >> );
else
return gcd3(y,x-y);
}
}
}
笔试算法题(34):从数字序列中寻找仅出现一次的数字 & 最大公约数(GCD)问题的更多相关文章
- 《剑指offer》第四十四题(数字序列中某一位的数字)
// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1, ...
- Python实现在给定整数序列中找到和为100的所有数字组合
摘要: 使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度: 初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...
- 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)
议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排 ...
- 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位
剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...
- 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...
- 算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)
题: 给定一个序列S以及它的一个子序列T,求S的所有包含T的子序列.例: S = [1, 2, 3, 2, 4] T = [1, 2, 4] 则S的所有包含T的子序列为: [1, 2, 3, 2, 4 ...
- 笔试算法题(37):二叉树的层序遍历 & 最长递增的数字串
出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b c d e f g h i 分 ...
- 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积
出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...
- 每日一题 - 剑指 Offer 44. 数字序列中某一位的数字
题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 规律 难易程度:中等 题目描述: 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个 ...
随机推荐
- PCB CAM自动化后台配置说明
CAM自动化项目经历9个月时间里,在我们IT团队与工程部深入合作下,依据PCB各种场景定制特定功能,且这几个月里在不断的改进与迭代脚本功能,在此期间攻破了一个又一个难题,最终项目第一阶段已顺立上线运行 ...
- 小程序各种授权封装、saveImageToPhotosAlbum、chooseAddress、getUserInfo、getLocation,保存图片、获取用户信息、获取位置信息、收货地址等
代码略多,请异步 github __点击链接
- NOI题库--盒子和小球系列 By cellur925
题目传送门 盒子和小球之二:N个有差别的盒子(1<=N<=20).你有A个红球和B个蓝球.0 <= A <= 15, 0 <= B <= 15.球除了颜色没有任何区 ...
- nginx静态资源服务器简单配置
有时候我们可以把服务器的一些文件放在固定目录以便下载,比如image,css,js等.就可以使用nginx转发静态资源. 参考链接:https://blog.csdn.net/name_is_wl/a ...
- Logstash同步mysql数据库信息到ES
@font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @fo ...
- PowerDesigner在PDM转换为sql脚本时报错Generation aborted due to errors detected during the verification of the mod
在设计概念数据模型(CDM)之后,转换为物理数据模型(PDM),之后转换为sql脚本时报错Generation aborted due to errors detected during the ve ...
- _bzoj1051 [HAOI2006]受欢迎的牛【强联通】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1051 保存tarjan模版. 求强联通分量,缩点. #include <cstdio& ...
- 229 Majority Element II 求众数 II
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 你的算法应该在O(1)空间中以线性时间运行. 详见:https://leetcode.com/problems/major ...
- Quartz~关于cron表达式要说的
每20秒执行一次
- Hibernate配置(外部配置文件方式)
配置Hibernate有2种方式,本文讲的是通过外部配置文件配置的方式 Hibernate核心配置文件 <?xml version='1.0' encoding='UTF-8'?> < ...