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
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- Android 实现对图片 Exif 的修改(Android 自带的方法)
- [容器]STL之vector容器详解
- 系统学习Linux系统第一天:5-11
- MySQL快速入门(二)
- 209. Minimum Size Subarray Sum 【M】【35】
- 37.数组中只出现一次的数字
- (4.1.23.13)自定义控件三部曲之动画篇(十一)——layoutAnimation与gridLayoutAnimation
- 蓝桥杯 算法提高 拿糖果(筛法+动态规划)
- 五虎棋
- 【安卓中的缓存策略系列】安卓缓存策略之磁盘缓存DiskLruCache
- HDU 1241 Oil Deposits
- 随便写写
- [容器]STL之deque容器详解
- linux基本命令(22)——find命令参数详解