single number

来源:互联网 发布:食品科学与工程知乎 编辑:程序博客网 时间:2024/04/30 03:44

有先排序在求的,O(nlogn)

1.

// Single Number.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;int singleNumber(int A[], int n) {if(A == NULL || n == 2)return -1;else if (n == 1)return A[0];int num = A[0];for(int i = 1; i < n; ++ i){num ^= A[i];}return num;}//=====================================================void Test(char* testName, int* A, int len, int expected){if(testName != NULL)        printf("%s begins: \n", testName);for(int i = 0; i < len;++ i){cout<<A[i];}cout<<endl;int result = singleNumber(A, len);cout<<"result: "<<result<<endl;if(result == -1 && expected == -1)cout<<"Passed!"<<endl;elsecout<<"Failed!"<<endl;}void Test1(){int A[1] = {1};Test("Test1", A, 1, 1);}int _tmain(int argc, _TCHAR* argv[]){Test1();return 0;}

2

// Single Number.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;//一个数组中数成对出现,除了两个数,找出这两个数,O(N)unsigned int FindFirstBitIs1(int number){int indexBit = 0;//完全不知道应该用sizeof计算位数while((number & 1) == 0 && indexBit < 8 * sizeof(int)){number = number >> 1;++ indexBit;}return indexBit;}bool IsBit1(int num, unsigned int indexOf1){//直接右移多少位可,不用循环右移num = num >> indexOf1;return num & 1;}void singleNumber(int A[], int len, int* num1, int* num2) {if(A == NULL || len <=2 && A[0] == A[1]){*num1 = -1;*num2 = -1;return;}else if (len == 2 && A[0] != A[1]){*num1 = A[0];*num2 = A[1];return;}int resultExclusiveOR = 0;//1. 异或for(int i = 0; i < len; ++ i)resultExclusiveOR ^= A[i];//用unsigned int//2.异或结果最右边的1的位置,不同的数一定某位是1unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);//3.以1的位置将数组进行分割,一半是1一半是0*num1 = *num2 =0;for(int i = 0; i < len; ++ i){if(IsBit1(A[i], indexOf1))*num1 ^= A[i];else*num2 ^= A[i];}}//=====================================================void Test(char* testName, int* A, int len, int expected1, int expected2){if(testName != NULL)        printf("%s begins: \n", testName);for(int i = 0; i < len;++ i){cout<<A[i];}cout<<endl;int result1;int result2;//都忘了用&,使用已有的变量,将值进行返还,传递地址即可singleNumber(A, len, &result1,&result2);//可是不对应if((result1 == expected1 && result2 == expected2 )||(expected2 == result1 && expected1 == result2))cout<<"Passed!"<<endl;elsecout<<"Failed!"<<endl;cout<<"result1: "<<result1<<"\n"<<"result2: "<<result2<<endl;}void Test1(){int A[2] = {1,2};Test("Test1", A, sizeof(A)/sizeof(int), 1,2);}int _tmain(int argc, _TCHAR* argv[]){Test1();return 0;}
3.
// Single NumberII.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>using namespace std;//数组中的数都出现3次除了1个数,时间复杂度O(N),空间复杂度O(1)情况下找到这个数int singleNumber(int A[], int len){if(len <= 0)return len;int result = 0;for(int i = 0;i < 32; ++ i){//index 左移表示 1的位置int count = 0, index = 1 << i ;for(int j = 0; j < len; ++ j){//&结果是boolif(A[j] & index)++ count;}//cout<<count<<endl;int count3 = count % 3;if(count3)result |= index;//result |= count3<<i;不知道为什么后者比前者节约16ms}return result;}//==============================================================================================void Test(string testName, int* A, int len, int expected){if(testName.size() > 0){cout<<testName<<" begins: "<<endl;}for(int i = 0; i < len; ++ i){cout<<A[i];}cout<<endl;int result = singleNumber(A, len);if(result == expected)cout<<"Passed!"<<endl;elsecout<<"Failed"<<endl;cout<<"result: "<<result<<endl;}void Test1(){int A[4] = {10,10,11,10};Test("Test1", A, 4, 3);}int _tmain(int argc, _TCHAR* argv[]){Test1();return 0;}



0 0
原创粉丝点击