引言

  对于刷题,自己是没能力的. 最经一个朋友同事考我一道数组题 . 也许能当面试分享吧. 娱乐娱乐.

事情的开始是这样的.

前言

  题目 截图

大概意思 是 在一个 数组中,找出其中两个不重复出现的元素. 其它元素都是两两出现. 返回结果顺序不要求.

好这里 看这个系统给我们的答题界面 . 我们选择C

后面你只要做好题,就可以先 Run Code检测,后面 Submit Solution 提交了.

下面我会讲出我的思路. 我没有Goolge答案, 也许不是最屌解. 大家可以再优化.

正文

1.思索算法出路

  首选对于算法复杂度大于O(n),肯定不行.这里那就采用O(n)级别的套路. 这里有个 数学尝试

a ^ a = 0, a ^ 0 = a, a ^ b = b ^ a. => a ^ b ^ a = a ^ a ^ b = 0 ^ b = b

其中 ^ 表示异或的意思. 记得学习电子的是偶 好像 a ⊕ b是吧,不记得了,过吧.

  从上面算学只是我们很容易知道.

a ^ a = 0, 那么 我们把上面 int* nums; 所有结果 异或, 最后得到 要找的两个数的异或值.

  好,那我们需要找出 其中一个数, 假定最后得到的数需要为 a,b

那么上面 最后结果 就是 a ^ b => 转成二进制码 假如为 0x001100, 那么 a 和 b 在第三位 和第四位 二进制是不一样的.

那么我们只需要找到 第一个 不一样的二进制位数, 再把 nums 中 这些位相同的 再异或一下就得到其中一个 结果.

第一版代码如下

 /**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumber(int* nums, int numsSize, int* returnSize) {
int* nnums = malloc(sizeof(int)*);
int i,j,sum = , flag = ;
int a = , b; // 先求所有的异或结果
for(i=; i<numsSize; ++i)
sum ^= nums[i];
//找到第一个位
while(!(flag&sum))
flag <<= ; for(i=; i<numsSize; ++i)
if(flag & nums[i])
a ^= nums[i]; nnums[] = a;
nnums[] = a ^ sum; *returnSize = ;
return nnums;
}

这样的代码 比较普通.

测试通过要求, 下面我会优化一下!

2.简单优化

到这里我们优化一下,先直接看代码

 /**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumber(int* nums, int numsSize, int* returnSize) {
int sl = , x, a = ;
int* end = nums + numsSize;
int* pt = nums;
//得到所有数据的异或和
while(pt<end)
sl ^= *pt++; // 找到第一个 位数
x = sl & -sl;
//先找到第一个数
while(pt > nums){
int t = *--pt;
if(x&t)
        a ^= t;
} nums[] = a;
nums[] = a^sl;
*returnSize = ;
return nums;
}

用的技巧比较多, 例如  sl & -sl 找到最低位1出现的 位置值. 例如 sl = 0x0110 => sl & -sl => 0x0010.

最后看运行结果图

运行测试 平均时间 4ms, 第一梯队. 可能有更好的算法. 这里就这样了. 有机会 再被问,再同大家分享吧.

大家有机会有时间尝试尝试 LeetCode QJ.

后记

  错误是难免的. 有问题留言交流. 祝 今天 阳光明媚, 现在物价太高, 日子有点难,.....

再扯一点, 30年前 一部大哥大 5000元多贵,现在印度安卓手机 包邮170, 其中150是邮费.

我觉得房价也是这样, 租个10年. 后面也就是大白菜了......

  每个时代总有忽悠的主题, 缓一缓,思索后前进总有路子,

帮朋友 解决一道 LeetCode QJ上问题的更多相关文章

  1. 解决一道leetcode算法题的曲折过程及引发的思考

    写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...

  2. 记一次帮朋友解决apache站点403错误的过程

    apache版本: [root@iZ25eby2utyZ web]# rpm -qa | grep httpd httpd-tools--.el6.centos..x86_64 httpd--.el6 ...

  3. 【一天一道LeetCode】#205. Isomorphic Strings

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  4. 【一天一道LeetCode】#260. Single Number III

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  5. 【一天一道LeetCode】#292. Nim Game

    一天一道LeetCode 从今天开始,调整规律,不按顺序做,从easy开始! 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 ...

  6. 【一天一道LeetCode】#115. Distinct Subsequences

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  7. 【一天一道LeetCode】#79. Word Search

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  8. 【一天一道LeetCode】#75. Sort Colors

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. 【一天一道LeetCode】#72. Edit Distance

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

随机推荐

  1. python实现批量ping IP,并将结果写入

    最近工作需要,写了一个Python小脚本,分享给大家,因为公司的IP用的差不多了,然后离职人员的IP有没有及时删除,导致没多少IP用了,所以做了一个python脚本跑了跑,清出来一堆ping不通的IP ...

  2. JavaScript之数组循环 forEach 循环输出数组元素

    var arrayAll = []; arrayAll.push(1); arrayAll.push(2); arrayAll[arrayAll.length] = 3; arrayAll[array ...

  3. jquery递归遍历xml文件,形成ul-li序列,生成树结构(使用了treeview插件)

    treeview插件从这里获得,下载的文件中有demo,看demo文件夹里面的index.html文件就差不多知道如何使用该控件了,在我做的项目里用到的部分代码截图如下(在引用下面的js文件前要先引用 ...

  4. Ugly Window 【acm题】

    话说好久没有碰acm题目了.............................. 看到Ugly Window这道题目,没有多想,就直接先找到字母的连续长度和连续高度,并统计该字母的总个数,然后用 ...

  5. 手机h5 页面 iPhone 下 手机号码 蓝色字体 黑色字体

    在手机端 苹果系统下 手机号码会变成蓝色的 ,如何不让手机号变成蓝色  黑色 或者其他颜色 , 苹果真是的 原因是识别成了电话号码,然后成为了链接.解决方法: 更改链接的颜色 a{ color: re ...

  6. Objective-C中#define的常见用法

    参考博客 http://blog.csdn.net/kindazrael/article/details/8108868 在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强.预处 ...

  7. makefile 中定义宏位置需要注意一下

    CUR_DIR = $(shell pwd) CFLAGS = -g -Wall GCC = gcc GXX = g++ TARGET = exe.out SRC_FILES += $(shell f ...

  8. Vim中的正则表达式[转]

    来自:http://blog.csdn.net/endall/archive/2007/08/29/1764554.aspx Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操 ...

  9. 地球坐标系与投影方式的理解(关于北京54,西安80,WGS84;高斯,兰勃特,墨卡托投影)

    一.地球模型 地球是一个近似椭球体,测绘时用椭球模型逼近,这个模型叫做参考椭球,如下图: 赤道是一个半径为a的近似圆,任一圈经线是一个半径为b的近似圆.a称为椭球的长轴半径,b称为椭球的短轴半径. a ...

  10. HTML 5缓存机制:Cache Manifest配置实例

    Cache Manifest是HTML 5的一种缓存机制,文章作者直接用博客当测试环境,虽然[color=#444444 !important]应用起来非常简单,但效果却出奇的好.缓存后的速度,简直是 ...