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

分析:

  • 由于知道一个数字异或操作它本身(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)问题的更多相关文章

  1. 《剑指offer》第四十四题(数字序列中某一位的数字)

    // 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1, ...

  2. Python实现在给定整数序列中找到和为100的所有数字组合

    摘要:  使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度:  初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...

  3. 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

    议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排 ...

  4. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  5. 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应

    出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...

  6. 算法题:求一个序列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 ...

  7. 笔试算法题(37):二叉树的层序遍历 & 最长递增的数字串

    出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b  c d  e  f  g h  i  分 ...

  8. 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积

    出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...

  9. 每日一题 - 剑指 Offer 44. 数字序列中某一位的数字

    题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 规律 难易程度:中等 题目描述: 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个 ...

随机推荐

  1. NDK相关收藏【转】

    http://blog.csdn.net/column/details/anidea-ndk.html   [转] 作者:conowen@大钟

  2. Ubuntu 14.04 配置 Java SE jdk-7u55 (转载)

    转自:http://blog.csdn.net/tecn14/article/details/24797545 JDK  目前最新版为jdk-8u5,这次没有选择安装最新的jdk8,而是要安装jdk7 ...

  3. 使用FFMPEG从MP4封装中提取视频流到.264文件 (转载)

    命令行: ffmpeg -i 20130312_133313.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 20130312_133313.264 说明 ...

  4. ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(四)图书信息的增删改查

    前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...

  5. glance镜像服务

    一.glance介绍: 因为云平台是提供Iass层的基础设施服务,我们拿到的是一台虚拟机,那么要用虚拟机的话必须有底层的镜像做支撑,所以说镜像的话也有一个服务来管理.但是我们云平台用的镜像不是装操作系 ...

  6. element中upload单图片转base64后添加进数组,请求接口

    //先上代码 <template> <!-- data绑定的参数 getuploadloge: [ { url: '', name: '' } ], --> <!-- 编 ...

  7. iOS导航栏NavigationBar的颜色,按钮和标题以及字体颜色

    首先,层级关系: leftBarButtonItem.rightBarButtonItem.title都是加在UINavigationItem上的,UINavigationItem再加在Navigat ...

  8. 《windows核心编程系列》二十一谈谈基址重定位和模块绑定

    每个DLL和可执行文件都有一个首选基地址.它表示该模块被映射到进程地址空间时最佳的内存地址.在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000.对于DLL来说,链接器会将它的首 ...

  9. 简单的AndroidStudio单元测试工程配置

    转载: http://www.jianshu.com/p/03118c11c199

  10. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)

    在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...