帮朋友 解决一道 LeetCode QJ上问题
引言
对于刷题,自己是没能力的. 最经一个朋友同事考我一道数组题 . 也许能当面试分享吧. 娱乐娱乐.
事情的开始是这样的.
前言
题目 截图
大概意思 是 在一个 数组中,找出其中两个不重复出现的元素. 其它元素都是两两出现. 返回结果顺序不要求.
好这里 看这个系统给我们的答题界面 . 我们选择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上问题的更多相关文章
- 解决一道leetcode算法题的曲折过程及引发的思考
写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...
- 记一次帮朋友解决apache站点403错误的过程
apache版本: [root@iZ25eby2utyZ web]# rpm -qa | grep httpd httpd-tools--.el6.centos..x86_64 httpd--.el6 ...
- 【一天一道LeetCode】#205. Isomorphic Strings
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...
- 【一天一道LeetCode】#260. Single Number III
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 【一天一道LeetCode】#292. Nim Game
一天一道LeetCode 从今天开始,调整规律,不按顺序做,从easy开始! 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 ...
- 【一天一道LeetCode】#115. Distinct Subsequences
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 【一天一道LeetCode】#79. Word Search
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 【一天一道LeetCode】#75. Sort Colors
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 【一天一道LeetCode】#72. Edit Distance
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...
随机推荐
- Linux下查看文件和文件夹大小(转)
觉得挺有用的,就转到了自己的博客里,方便以后查询: 转自:http://www.cnblogs.com/benio/archive/2010/10/13/1849946.html 当磁盘大小超过标准时 ...
- 【HTTP】POST 与 PUT 方法区别
1. POST 用于向服务端发送数据,常用于表单数据提交: PUT 用于向服务器上的资源(如文件)中存储数据: 2. 302 303 307 状态码区别 他们都是重定向(临时重定向 p.s 301 ...
- 为知笔记 Markdown 新手指南
为知笔记 Markdown 新手指南 http://www.wiz.cn/feature-markdown.html 时序图,流程图详细流程图语法 http://adrai.github.io/flo ...
- c++需要注意的地方和小算法
C++11的标准 auto //可以自动类型, auto cars=//自动转化为int 强制转换 (long)thorn =long (thorn) //前者是c标准,后者是c++ 还有一种 sta ...
- USACO Section 2.2 循环数 Runaround Numbers
OJ:http://www.luogu.org/problem/show?pid=1467 #include<iostream> #include<vector> #inclu ...
- Eclipse 启动Tomcat后web项目的classes的子文件夹中没有calss文件
Eclipse 启动Tomcat后web项目的classes的子文件夹中没有calss文件. 经网上查得以下方法可解决 把properties属性里的java compiler-->buildi ...
- SimpleAdapter类使用方法
SimpleAdapter的构造函数是: public SimpleAdapter (Context context, List<? extends Map<String, ?>&g ...
- ASP.NET MVC4 学习系统三(控制器Controller)
控制器(Controllers) 在MVC架构模式的上下文里,控制器响应用户的输入(比如,用户点击“保存”按钮),并协调模型.视图以及(经常)数据访问层.在ASP.NET MVC程序里,控制器就 ...
- HTTP协议请求方式: 中GET、POST和HEAD的介绍以及错误提示码
HTTP协议中GET.POST和HEAD的介绍 2008-05-10 14:15 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档 ...
- ajax 清除缓存
$.ajax({ url : actionUrl , beforeSend :function(xmlHttp){ // deforeSend 是请求前清除缓存 ,如果没有缓存也不使用before ...