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

分析:

  • 由于知道一个数字异或操作它本身(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. Codeforces Round #382 (Div. 2) (模拟|数学)

    题目链接: A:Ostap and Grasshopper B:Urbanization C:Tennis Championship D:Taxes 分析:这场第一二题模拟,三四题数学题 A. 直接模 ...

  2. bzoj 2792: [Poi2012]Well【二分+贪心】

    #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const ...

  3. poj 3281 Dining【最大流】

    记得把牛拆掉!拆成两个点i和i'在中间连一条流量为1的边,来限制每头牛只能选一组 一般来讲是一种物品一个消费者各占一边,但是这里有两个物品,所以考虑把牛放在中间,s向所有的食物连流量为1的边,所有食物 ...

  4. 洛谷P3287 [SCOI2014]方伯伯的玉米田(树状数组)

    传送门 首先要发现,每一次选择拔高的区间都必须包含最右边的端点 为什么呢?因为如果拔高了一段区间,那么这段区间对于它的左边是更优的,对它的右边会更劣,所以我们每一次选的区间都得包含最右边的端点 我们枚 ...

  5. Scala入门到精通

    原文出自于: http://my.csdn.net/lovehuangjiaju 感谢! 也感谢,http://m.blog.csdn.net/article/details?id=52233484 ...

  6. c语言中的rand()函数用法

    rand() rand()函数作用:用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()函数返回:返回一个范围在 ...

  7. A - Supercentral Point CodeForces - 165A

    One day Vasya painted a Cartesian coordinate system on a piece of paper and marked some set of point ...

  8. jenkins一次构建两次触发job问题

    具体内容详见: https://issues.jenkins-ci.org/browse/JENKINS-21464?focusedCommentId=250183&page=com.atla ...

  9. iOS开发之邮件发送代码

    邮件发送功能是由MessageUI Framework提供的,这个框架是iPhone sdk中最简单的框.由一个类.一个视图控制器,一个protocol组成. 一.创建视图控制器: MFMailCom ...

  10. jdk 1.8下 java ArrayList 添加元素解析

    转载请注明http://www.cnblogs.com/majianming/p/8006452.html 有人问我,java ArrayList底层是怎么实现的?我就回答数组,他再问我,那它是怎么实 ...