37.数组中只出现一次的数字

来源:互联网 发布:苹果看书软件 编辑:程序博客网 时间:2024/06/11 08:33
数组中只出现一次的数字
  • 参与人数:2603时间限制:1秒空间限制:32768K
  • 本题知识点: 数组
  •  算法知识视频讲解

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
这道题思路想出来后就很简单了,可是我却写错了一个地方,导致调试了很久。。
// 37.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <vector>using namespace::std;class Solution {public:void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {if (data.size() < 2) return;int divideNum = 0;for (int i = 0; i < data.size(); i++) {divideNum ^= data[i];}unsigned int bit = 0;while (((divideNum & 1) == 0) && (bit < 8 * sizeof(int))) {divideNum = divideNum >> 1;bit++;}*num1 = *num2 = 0;for (int i = 0; i < data.size(); i++) {if (IsBit(data[i], bit)) {*num1 = *num1 ^ data[i];}else {*num2 = *num2 ^ data[i];}}}bool IsBit(int num, int index){num = num >> index;return (num & 1);}bool isZero(int num, unsigned int index) {num = num >> index;return (num & 1);}};int _tmain(int argc, _TCHAR* argv[]){vector<int> test;test.push_back(2);test.push_back(4);test.push_back(3);test.push_back(6);test.push_back(3);test.push_back(2);test.push_back(5);test.push_back(5);Solution s;int num1, num2;s.FindNumsAppearOnce(test, &num1, &num2);return 0;}

if (IsBit(data[i], bit))
我写成了
if (IsBit(*num1, bit))
吸取教训!
第二次做:
第一次做时,采用的是右移,算术右移和逻辑右移的区别很大,然而算术左移和逻辑左移是一样的,所以第二次做,我把右移换成了左移计算。
// 数组中只出现一次的数字.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <vector>using namespace::std;class Solution {public:void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {if (data.size() < 2) return;int odd = 0;for (int i = 0; i < data.size(); ++i) {odd ^= data[i];}unsigned int sperate = getOdd(odd);*num1 = 0;*num2 = 0;for (int i = 0; i < data.size(); ++i) {if (hasBit(data[i], sperate))*num1 ^= data[i];else*num2 ^= data[i];}}unsigned int getOdd(int divideNum) {int test = 1;unsigned int bit = 0;while (((divideNum & test) == 0) && (bit <= 8 * sizeof(int))) {test = test << 1;++bit;}return bit;}bool hasBit(int num, int index) {int test = 1;test = test << index;return (num & test);}};int _tmain(int argc, _TCHAR* argv[]){vector<int> test;test.push_back(2);test.push_back(4);test.push_back(3);test.push_back(6);test.push_back(3);test.push_back(2);test.push_back(5);test.push_back(5);Solution s;int num1, num2;s.FindNumsAppearOnce(test, &num1, &num2);return 0;}

第三次做:
class Solution {public:    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {if ( data.size() < 2 ) return ;                int test = 0 ;                for ( vector<int>::iterator iter = data.begin(); iter != data.end(); ++ iter ) {            test ^= *iter ;        }                int bitIndex = get_bit_index( test ) ;                *num1 = *num2 = 0 ;        for ( vector<int>::iterator iter = data.begin(); iter != data.end(); ++ iter ) {            if ( has_bit( *iter, bitIndex ) ) *num1 ^= *iter ;            else *num2 ^= *iter ;        }    }        int get_bit_index( int n ) {     int test = 1 ;        int bits = 0 ;        while ( ( ( n & test ) == 0 ) && ( bits < 8 * sizeof(int) ) ) {            test = test << 1 ;            ++ bits ;        }                return bits ;    }        bool has_bit( int n, int index ) {        int test = 1 ;        test = test << index ;        return n & test ;    }};

注意
( n & test ) == 0 
写成
 n & test  == 0 
是错误的!位运算的优先级比较低!
0 0
原创粉丝点击