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

分析:

  • 由于知道一个数字异或操作它本身(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. nodejs--JWT 在前后端分离中的应用与实践

    nodejs--JWT 在前后端分离中的应用与实践 http://www.cnblogs.com/lidongyue/p/5269695.html

  2. 09年OA系统集成商资料(转载)

    [转载]哪个OA比较好,18家常见OA系统全方位大阅兵 原文地址:http://ec.zdnet.com.cn/managesoft/2009/1104/1503211.shtml 凡是比较或者评测的 ...

  3. arcgis for silverlight 鼠标点击地图获取当前经纬度

    silverlight代码: 地图的name值是myMap.后台在页面初始化的时候,添加地图的点击事件 myMap.MouseClick+=new EventHandler<Map.MouseE ...

  4. 【转载】SQL面试题

    [本文转自]http://blog.csdn.net/u012467492/article/details/46790205 1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name   ...

  5. 【黑金教程笔记之005】【建模篇】【Lab 04 消抖模块之二】—笔记

    实验四和实验三的区别在于输出.实验三是检测到由高到低的电平变化时就拉高输出,检测到由低到高的电平变化时就拉低输出.而实验四检测到由高到低的电平变化时产生一个100ms的高脉冲.当检测到由低到高的电平变 ...

  6. E20170524-hm

    logging   n. <美>伐木搬运业; 记录,存入; 航行日志; inversion  n. 倒置; 转化; (尤指词序) 倒装; (染色体的) 倒位; reversion   n. ...

  7. Hibernate对集合属性的操作---基础学习

    1:Set集合属性操作 1).Hibernate3以后支持大部分重要的JDK集合接口映射,Set集合接口的配置:  >在xxx.hbm.xml文件中使用<set>标签 2).< ...

  8. 又一篇Centos7下的asp.net core部署教程

    历程2个多月的学习,我终于从PHP转.Net开发了. 从壹开始前后端分离[ .NETCore2.1 +Vue 2 +AOP+DI]框架 感谢老张的博客,我对asp.net core入门主要就是靠他的博 ...

  9. 557. 反转字符串中的单词 III

    给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输出: &q ...

  10. 进击的Python【第十章】:Python的高级应用(多进程,进程间通信,协程与异步,牛逼的IO多路复用)

    Python的socket高级应用(多进程,协程与异步) 一.多进程multiprocessing multiprocessing is a package that supports spawnin ...