剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题目给定:num1,num2分别为长度为1的数组。传出参数;将 num1[0], num2[0] 设置为返回结果。。
一 . 题目分析
题目说的太笼统,举例分析。
例如:给定的数组是这个:int[] z = new int[8] {2,4,3,6,3,2,5,5 }; 因为2/3/5都有两个,所以输出的是num1[0]=4; num2[0]=6。。
分析步骤:
1 . 遍历数组 + 遍历内容(循环异或运算)
异或运算为二进制运算符,但是运用在这里非常合适。设置一个0,从头到尾遍历数组,相同的数都相互抵消了,最后仅剩两个不同的数的异或结果。(两个相同的数可理解成第一次异或就是乘法,第二次异或就除法)

2 . 数组分组
因为要把两个不同的数组放到两个空数组里面,所以这里还要搞一下,因为上面的步骤仅仅是求出的两个数的异或结果,所以,接下来做的就是分组。可以知道的是这两个数不相同的数的异或结果肯定不是0,因为是0的话,而知就相等了。所以,我们可以考虑一下,把这两个数异或的结果搞一搞,找出他们二进制最低位的第一个1(也就是他们最低位第一个不同的位置,因为异或不同为1,相同为0嘛)。我们设一个1,用&运算符算,原因是我们设的这个1可以是000000000.....000001,&也就是AND运算符是只有两个都是1的时候才得1,其他一切情况下都是0。当然他们&后为1也是我们的停止条件。
int y = ;
while( (x & ) == )
{
x = x >> ;
y = y << ;
}
分析一下这段代码。将x与1执行AND运算。非0的话,x的二进制就右移一位,y就左移一位(虽不参与运算,但是用在下一步,作为分组的比较条件),这样就把x的第一个二进制1找到了,(例如:二进制8,就变成了y最后就变成了100)
3 . 分组挑选
通过y将数组分成两部分。
二 . 代码实现
class Solution
{
public void FindNumsAppearOnce(int[] array, int[] num1, int[] num2)
{
// write code here
if (array.Length < )
{
return;
}
// 找出两个不同数的异或结果
int x = ;
foreach (int i in array)
{
x ^= i;
}
// 找出他们异或结果二进制数最右面的一个1,注意(x & 1)要括起来,注意计算顺序
int y = ;
while( (x & ) == )
{
x = x >> ;
y = y << ;
}
// 第二次遍历找出两个不同的数
foreach(int j in array)
{
if ((j & y) == )
{
num1[] ^= j;
}
else
{
num2[] ^= j;
}
}
}
}
剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字的更多相关文章
- 【剑指offer】面试题40:数组中只出现一次的数字
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...
- (剑指Offer)面试题40:数组中只出现一次的数字
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 这道题的简单版本是除了一个数字之外,其他数字都出现了两次,这个很简单,将所有的数异或一遍就 ...
- 剑指Offer - 九度1384 - 二维数组中的查找
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 《剑指Offer》面试题-二维数组中的查找
题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指offer【01】- 二维数组中的查找(Java)
在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...
- 剑指offer面试题3二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 需要与面试官确认的是,这 ...
- 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
随机推荐
- Java拓展教程:文件DES加解密
Java拓展教程:文件加解密 Java中的加密解密技术 加密技术根据一般可以分为对称加密技术和非对称加密技术.对称加密技术属于传统的加密技术,它的加密和解密的密钥是相同的,它的优点是:运算速度快,加密 ...
- uboot 2013.01 代码简析(2)第一阶段初始化
uboot执行"make smdk2410_config"之后就可以进行编译了,可以执行make命令进行编译, 因为整个输出太长,我仅仅列出部分最关键的输出(部分我不关心的内容直接 ...
- iOS数据持久化存储之归档NSKeyedArchiver
归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),收集了网上的一些资料并结合自己的一些经验,总结如下. 一.使用archiveRootObject进行简 ...
- Hadoop- 流量汇总程序之如何实现hadoop的序列化接口及代码实现
流量汇总程序需求 统计每一个用户(手机号)锁耗费的总上行流量.下行流量.总流量. 流程剖析 阶段:map 读取一行数据,切分字段, 抽取手机号,上行流量,下行流量 context.write(手机号, ...
- BZOJ 1370 [Baltic2003]Gang团伙:并查集【虚点】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1370 题意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: (1)我 ...
- POJ 2409 Let it Bead:置换群 Polya定理
题目链接:http://poj.org/problem?id=2409 题意: 有一串n个珠子穿起来的项链,你有k种颜色来给每一个珠子染色. 问你染色后有多少种不同的项链. 注:“不同”的概念是指无论 ...
- html5基本格式
html5基本格式 学习要点: HTML5 文档的基本格式 2. 开发工具的基本操作 一. 文档基本格式 <!DOCTYPE html> 文档声明,告诉计算机这是一个HTML5文档. ...
- Zookeeper用来干什么?
在Zookeeper的官网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, n ...
- 深度学习在gilt应用——用图像相似性搜索引擎来商品推荐和服务属性分类
机器学习起源于神经网络,而深度学习是机器学习的一个快速发展的子领域.最近的一些算法的进步和GPU并行计算的使用,使得基于深度学习的算法可以在围棋和其他的一些实际应用里取得很好的成绩. 时尚产业是深度学 ...
- 一个关于前端页面的小标签<tbody>
我们有时候希望将表格的内容分为多个模块,这时候就可以使用<tbody>标签,它是<table>的字标签,是<tr>的父标签,可以使用它达到一种设置样式的结果.