剑指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#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
随机推荐
- Android Weekly Notes Issue #322
Android Weekly Issue #322 August 12th, 2018 Android Weekly Issue #322. 本期内容包括: 键盘的图像支持; 网络安全实现; Kotl ...
- 如何设置确认selinux 模式【转】
本文转载自:http://blog.csdn.net/lei1217/article/details/48377109 [Description]linux SELinux 分成Enforce 以及 ...
- HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
题目链接:https://vjudge.net/problem/HDU-3247 Resource Archiver Time Limit: 20000/10000 MS (Java/Others) ...
- 51nod 1766
题意:给定一个树(10^5),m个询问(10^5),每次给定a,b,c,d,在区间[a,b]中选一个点,[c,d]选一个点,使得这两个点距离最大,输出最大距离. 题解:首先,我们有一个结论:对于一个集 ...
- matlab高亮显示选中的变量
第一步:点preference. 第二步:
- idea创建maven-archetype-webapp项目无java目录
使用idea创建一个maven-archetype-webapp项目 查看项目的目录结构,在main的目录下没有java目录 在main目录下创建java目录 使用快捷键 ctrl+alt+shift ...
- pod lib lint 报错 Unable to find a specification for `AMap2DMap` depended upon by `DingtalkPod
执行 pod验证 报错如下 ➜ DingtalkPod git:(2.0.0) ✗ pod lib lint --sources='https://github.com/AloneMonkey/Mo ...
- 【Lintcode】077.Longest Common Subsequence
题目: Given two strings, find the longest common subsequence (LCS). Your code should return the length ...
- python爬虫知识点总结(八)Selenium库详解
官方学习文档:http://selenium-python.readthedocs.io/api.html 一.什么是Selenium? 答:自动化测试工具,支持多种浏览器.用来驱动浏览器,发出指令让 ...
- 洛谷【P3437】[POI2006]TET-Tetris 3D
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 浅谈标记永久化:https://www.cnblogs.com/AKMer/p/1013 ...