首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
admin
2019-03-29
99
问题
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
选项
答案
/////////////////////////////////////////////////////////////////////// // Find two numbers which only appear once in an array // Input: data - an array contains two number appearing exactly once, // while others appearing exactly twice // length - the length of data // Output: num1 - the first number appearing once in data // num2 - the second number appearing once in data /////////////////////////////////////////////////////////////////////// void FindNumsAppearOnce(int data[], int length, int &num1, int &num2) { if (length < 2) return; // get num1 ^ num2 int resultExclusiveOR = 0; for (int i = 0; i < length; ++ i) resultExclusiveOR ^= data[i]; // get index of the first bit, which is 1 in resultExclusiveOR unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR); num1 = num2 = 0; for (int j = 0; j < length; ++ j) { // divide the numbers in data into two groups, // the indexOf1 bit of numbers in the first group is 1, // while in the second group is 0 if(IsBit1(data[j], indexOf1)) num1 ^= data[j]; else num2 ^= data[j]; } } /////////////////////////////////////////////////////////////////////// // Find the index of first bit which is 1 in num (assuming not 0) /////////////////////////////////////////////////////////////////////// unsigned int FindFirstBitIs1(int num) { int indexBit = 0; while (((num & 1) == 0) && (indexBit < 32)) { num = num >> 1; ++ indexBit; } return indexBit; } /////////////////////////////////////////////////////////////////////// // Is the indexBit bit of num 1? /////////////////////////////////////////////////////////////////////// bool IsBit1(int num, unsigned int indexBit) { num = num >> indexBit; return (num & 1); }
解析
这是一道很新颖的关于位运算的面试题。
首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。
这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现依次的数字,因为那些出现两次的数字全部在异或中抵消掉了。
有了上面简单问题的解决方案之后,我们回到原始的问题。如果能够把原数组分为两个子数组。在每个子数组中,包含一个只出现一次的数字,而其他数字都出现两次。如果能够这样拆分原数组,按照前面的办法就是分别求出这两个只出现一次的数字了。
我们还是从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果。因为其他数字都出现了两次,在异或中全部抵消掉了。由于这两个数字肯定不一样,那么这个异或结果肯定不为0,也就是说在这个结果数字的二进制表示中至少就有一位为1。我们在结果数字中找到第一个为1的位的位置,记为第N位。现在我们以第N位是不是1为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第N位都为1,而第二个子数组的每个数字的第N位都为0。
现在我们已经把原数组分成了两个子数组,每个子数组都包含一个只出现一次的数字,而其他数字都出现了两次。因此到此为止,所有的问题我们都已经解决。
转载请注明原文地址:https://jikaoti.com/ti/cfg7FFFM
0
程序员面试
相关试题推荐
Americanschoolsaren’texactlyfrozenintime,butconsideringthepaceofchangeinotherareasoflife,ourpublicschoolste
Inthissection,youareaskedtowriteanessaybasedonthefollowinginformation.Makecommentsandexpressyourownopinion.
将一整数逆序后放入一数组中(要求递归实现)
四个工人,四个任务,每个人做不同的任务需要的时间不同,求任务分配的最优方案。(2005年5月29日全国计算机软件资格水平考试——软件设计师的算法题)。
删除串中指定的字符
什么是ASP.net中的用户控件
在控制面板中,将鼠标的"右手习惯"改为"左手习惯"。
Office2000Office2000中文版中文版用()实现A.插入符号B.并排字符C.组合字符D.首字下沉
若要改变打印时的纸张大小,正确的是()A.[页面设计]对话框中的[纸张大小]B.[页面设计]对话框中的[中文版式]C.[版式]对话框中的[中文版式]D.[工具]对话框中的[选项]
一个软件的架构设计是随着技术的不断进步而不断变化的。以编译器为例,其主流架构经历了管道—过滤器到数据共享为中心的转变过程。以下关于编译器架构的叙述中,错误的是______。
随机试题
临床疑为DIC,应选择下列哪组筛选试验
在尿沉淀中找到移行上皮癌细胞,那么可不考虑下列哪种情况
A.单样本t检验B.配对t检验C.成组设计两样本均数比较的t检验D.成组设计两样本几何均数比较的t检验E.u检验欲分析新药疗效是否优于旧药,可用将钩端螺旋体患者的血清分别用标准株与水生株作凝溶试验,测得稀释倍数如下。标准株(10人)100
代谢产物为活性代谢物,并已作为药品使用的是体内代谢产物仍具活性,且作用时间较长的是
控诉、辩护和审判是刑事诉讼活动的三大诉讼职能,下列项中关于诉讼职能的表述,错误的是?
图示梁,A、B支座反力为()。
冰心说:“世界上没有一朵鲜花不美丽,没有一个孩子不可爱。因为每一个孩子都有一个丰富美好的内心世界。”这句话体现了()。
诊断性评价又称中期评价,是在健康教育活动中针对活动效果而进行的持续性的评价。()
唐高宗李治在位时期完成的《唐律疏议》是一部极为重要的法典,全面体现了中国古代法律制度的__________、风格和基本特征,成为中华法系的__________性法典,对后世及周边国家产生了极为深远的影响。填入划横线部分最恰当的一项是:
8086 CPU经加电复位后,执行第一条指令的地址是( )。
最新回复
(
0
)