我要找个数学好的男朋友

Single Number :  一个整数数列,除其中一个数以外,其他数都出现2次;试找出这个数

要求线性复杂度,且不用什么额外空间。

解题思路:

寻找一种位运算[1],满足结合律、交换律,且2个相同的数做该运算会得到单位元。

很容易想到位运算 同或,异或。以异或为例,

0^1 = 1,

0^0 = 0,

1^1 = 0.

0为单位元。满足交换律,结合律。

所有出现两次的数做按位异或运算得到0 (00000...),单位元0再与只出现一次的数运算,得到的结果还是这个数。

Single Number II:  一个整数数列,除其中一个数以外,其他数都出现3次;试找出这个数

要求线性复杂度,且不用什么额外空间。

解题思路:

寻找一种位运算,满足结合律、交换律,且3个相同的数做该运算会得到单位元。

试遍了8种 (要满足交换律)从{0,1} ->{0,1} 的位运算,根本不能。有时候思路难免过于局限。

这种运算是什么呢?  add bit by bit but mod 3.

 1 int singleNumber(int A[], int n) {
 2
 3     int carrier = 0, sum = 0,oneBits;
 4     int i = 0;
 5     for (;i< n;i++)
 6     {
 7         carrier += sum&A[i];
 8         sum ^= A[i];
 9
10         oneBits = carrier&sum;
11
12         carrier ^= oneBits;
13         sum ^= oneBits;
14     }
15
16     return (carrier<<1) + sum;
17
18 }

[1]位运算:因为最后要恢复只出现一次的那个数,按位运算可以保证维度。

题目来源:

https://leetcode.com/problems/single-number/

https://leetcode.com/problems/single-number-ii/

时间: 2024-11-16 09:58:06

我要找个数学好的男朋友的相关文章

找做IT的男朋友会不会没有隐私

找做IT的男朋友会不会没有隐私你不觉得自己在网上不断的“秀”啊,“晒”啊的行为才是根本所在吗?你应该怕自己的这种行为才对吧-———————————————————————————————————————————其实得到你的信息并不一定需要高手.普通人直接使用搜索引擎就可以找到很多不注重网络隐私的人的信息.就算你不泄漏,你朋友上传的关于你的图片,名字等也能出卖你,qq圈子之类的完全可以了解到你周围的人,你的爱好,你的习惯等大量信息,人人网等实名的网站也是. 有些信息不是这个人主动泄漏出来的,比如你

TX后台笔试

1,int *(*a)[3][4]; 求sizeof(a) sizeof(*a) sizeof(**a) sizeof(***a) sizeof(****a) 做错:4,48,16,4,4 这个做错不应该. 2,定义一个宏,求最高维的数目 如:int b[4][6];为4 #define DIM(x)  sizeof(x)/sizeof(x[0]) 蒙对,让我解释的时候,我自己SB说不是很确定 3,我傻逼了,吗的 int a[3] = {0,1,2};    int *p=a;    int *

第1次作业:我的成长心路历程

摘要:这篇文章主要写的是我看完一些优秀博文之后的感想.从最开始与计算机专业结缘开始,为什么选择计算机这个专业,谈至对未来就业的规划. 第一部分 结缘计算机 1.1 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 高考成绩出来以后,我就想选一个好的专业,热门的专业,工资高的专业,以后好找工作的专业,比如金融.计算机之类的.但是我并不懂这些专业具体学什么,所以我几乎天天都拿着那本<志愿填报指南>,各种辅助填报志愿的软件,各种百度.最后,我在华侨大学的通信工程与集美大学的计算机

辗转相除法求H.C.F小结

辗转相除法 大纲: 问题 原理 反思 1.     问题 一个试题,请完成以下填空 下列程序是利用辗转相除法求H.C.F(最大公约数) 1 include <stdio.h> 2 3 int main(){ 4 5 int m,n,r; 6 7 scanf("%d%d",&m,&n); 8 9 r=[?1]; 10 11 while([?2]){ 12 13 m=[?3];n=r;r=[?4]; 14 15 printf("h.c.f is %d&

快速排序小结

快速排序小结 大纲: 1.快排的原理 2.最坏情况 3.优化快排的方法 4.一般写法与更好的写法 1.快排的原理(本文重点)          伪代码: Void sqsort(int left,int right){ 1.随便找个数aN 2.把要排序的数组分成以下 区间 <aN|<aN|<aN|-|==aN|==aN|==aN|-|>aN|>aN|>aN|-| 3.分别递归<aN与>aN的两个部分 If(left<最右边的<aN.sub) sq

排序算法(二)-快速排序

快速排序就是随意找个基准数(就是一个用来参照的数,看下面就知道做什么的了).在一个数组a[10]中随意找个数,假如这个数是a[0]=8.方法很简单,从右向左找一个小于8的数,从左向右找一个大于8的数,然后交换他们.这里可以用两个变量i和j,分别指向数列的最左面和最右面,首先j出动,因为我们这里的基准数是最左面的数,所以j先出动,然后j一步步的往左走,直到找到小于8的数:之后i一步步往右走,直到找到大于8的数,然后交换i和j指向的值.就这样交换交换交换,直到i和j相等,当i和j相等时,交换a[0]

求解黑洞数

问题描述: 黑洞数又称陷阱数,是类具有奇特转换特性的整数.任何一个数字不全相同的整数, 经有限"重排求差"操作,总会得到某一个或一些数,这些数即为黑洞数. "重排求差"操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数. 举个例子,3位数的黑洞数为495. 简易推导过程:随便找个数,如297,3个位上的数从小到大和从大到小各排一次, 为972和279,相减得693.按上面做法再做一次,得到594,再做一次,得到495, 之后反复都得到495. 验证4位数

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

为什么程序员话少钱多死得早?-一位人生悲惨的程序员与你讲述其中原因

引子: 有一个段子:女人爱找程序员当男朋友,因为程序员话少钱多死得早. 哇咔咔,哈哈哈. 其实最开始听到这个词的时候我是拒绝的.因为我觉得我话挺多的,无论和谁,只要唠开了,就能滔滔不绝的唠下去: "哎呀老铁,你说的太对了,还有个事跟你说说--&%--¥--%--()&--%&%¥%--&". 所以我在想,程序员都是话少吗?不一定吧,像我和我的同学,都是话很多啊.但是经历过很多事的现在,再想想,发现事实的确如此,程序员确实话少. 为什么有人说我们话少: 首