• 第六十一题(找出数组中两个仅仅出现一次的数字)


    题目:一个整型数组里除了两个数字之外,其它的数字都出现了两次。

    请敲代码找出这两个仅仅出现一次的数字。

    要求时间复杂度是O(n),空间复杂度是O(1)。

    思路:先对全部数据进行异或得到结果result,两两同样的数据异或结果为0。因此result为两个仅仅出现1次的数字异或的结果,求得result左边第一个值为1的位,依据异或的性质可知,这两个仅仅出现一次的数字该位上的值肯定不同,一个为0,一个为1。以此为标准。对整个数组中的该位为1的数字进行异或。同样的数字两两消去,得到的结果为该位为1的仅仅出现了一次的数字,同理求得还有一个数字。

    C++代码:

    #include "stdafx.h"
    #include<iostream>
    namespace MS100P_61
    {
    	void findTwoSingle(int data[],int length)
    	{
    		int result=0;
    		for (int i = 0; i < length; i++)
    			result = result^data[i];	
    		
    		int bitIndex;
    		for (bitIndex = 0; bitIndex < 8 * sizeof(int); bitIndex++)
    		{
    			if (result&(1 << bitIndex))
    				break;
    		}
    					
    		
    		result = 0;
    		for (int i = 0; i < length;i++)
    		if (data[i] & (1 << bitIndex))
    			result = result^data[i];
    		cout << "one number is:" << result << endl;
    
    		result = 0;
    		for (int i = 0; i < length; i++)
    		if (!(data[i] & (1 << bitIndex)))
    			result = result^data[i];
    		cout << "the other is:" << result << endl;
    	}
    	void test()
    	{
    		int A[] = {3,3,2,2,12,12,7,-1};
    		findTwoSingle(A, 8);
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	MS100P_61::test();
    	return 0;
    }

    执行结果:


  • 相关阅读:
    android 通知栏 notifcation
    通过ResultSet获取到rs的记录数的几种方法
    网上书城随笔
    jdbc 事务
    正则表达式
    String,StringBuffer与StringBuilder的区别??
    Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区
    算法
    呵呵
    Hibernate
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6936480.html
Copyright © 2020-2023  润新知