統計序列中出現一次的數字

2021-07-16 18:22:56 字數 2535 閱讀 7003

//統計出現一次的數字(其它數字只出現兩次)

#include "stdafx.h"

#include

#include

#include

using namespace std;

unsigned int firstbitis1(int num)

int k = 0;

for (; num % 2 == 0; num /= 2)

return k;

}//unsigned int firstbitis1(int num)

// return index;

//}//bool is1(int num, unsigned int bit)

bool is1(int num, unsigned int bit)

int i,s=0;

unsigned int j;

if (data == null && length < 2)

for (i = 0; i < length; i++)

j = firstbitis1(s);

*num1 = 0;

*num2 = 0;

for (i = 0; i < length; i++)

else }

}// ********************測試**********************

void test(char* testname, int data, int length, int expected1, int expected2)

void test1()

; test("test1", data, sizeof(data) / sizeof(int), 4, 6);

}void test2()

; test("test2", data, sizeof(data) / sizeof(int), 4, 6);

}void test3()

; test("test3", data, sizeof(data) / sizeof(int), 4, 6);

}int _tmain(int argc, _tchar* argv)

題目原意是在數字序列中找出其中只出現一次的數字,而序列中的其他數字出現兩次。

可以這樣考慮:由於序列中的其它資料出現2次,因此,相同的數字異或運算得到的結果是0,而不同的兩數異或得到的二進位制結果中某個位上的數字必定為1。異或運算服從交換率,因此,將序列中的數字依次執行異或運算,最後得到的二進位制位中最低某位為1,假設該位為m位。很顯然,將序列中按第m位為1或0分為2個子序列,出現一次的數字分別位於兩個子串行中,兩個子串行中的其它數字軍出現兩次。再次分別將兩個子串行中的數字做異或運算,得到的兩個結果即為原序列中出現一次的數字。

該方法充分利用異或運算中同一位置二進位制數相同為0的性質,出現兩次的數字相異的結果為0,最終得出結果。

//劍指offer中統計出現一次的數字(其它數字只出現兩次)

#include "stdafx.h"

#include#include#includeusing namespace std;

unsigned int firstbitis1(int num)

int k = 0;

for (; num % 2 == 0; num /= 2)

return k;

}//unsigned int firstbitis1(int num)

// return index;

//}//bool is1(int num, unsigned int bit)

bool is1(int num, unsigned int bit)

int i,s=0;

unsigned int j;

if (data == null && length < 2)

for (i = 0; i < length; i++)

j = firstbitis1(s);

*num1 = 0;

*num2 = 0;

for (i = 0; i < length; i++)

else }

}// ********************測試**********************

void test(char* testname, int data, int length, int expected1, int expected2)

void test1()

; test("test1", data, sizeof(data) / sizeof(int), 4, 6);

}void test2()

; test("test2", data, sizeof(data) / sizeof(int), 4, 6);

}void test3()

; test("test3", data, sizeof(data) / sizeof(int), 4, 6);

}int _tmain(int argc, _tchar* argv)

{ test1();

test2();

test3();

/*cout <

陣列中出現一次的數字

題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 分析 我們可以先考慮乙個稍微簡單點的情況,乙個整型陣列裡除了乙個數字之外,其他的數字都出現了兩次。這是上面題目的乙個簡化版本。我們只要能解決這個問題了,然後將...

只出現一次的數字

1.乙個整型陣列,有乙個數字出現一次,其餘數字出現兩次,找出這個只出現一次的數字。解題思路 異或運算性質 兩個相同的數字異或得0,0與乙個數字異或得數字本身,而且異或運算是滿足交換律的 陣列元素按位異或,交換律可以想象成相同的數字參與運算的時候是相鄰的 所有出現兩次的數字異或之後得0,最後剩餘的是0...

只出現一次的數字

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1示例 2 輸入 4,1,2,1,2 輸出 4核心思想 對list排序,然後遍歷 class ...