面试题56: 数组中数字出现的次数
生活随笔
收集整理的這篇文章主要介紹了
面试题56: 数组中数字出现的次数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*******************************************************************
*《劍指Offer——名企面試官精講典型編程題》C++代碼
*
* htfeng
* 2018.10.09
*
* 面試題56: 數組中數字出現的次數
* 題目一:數組中只出現一次的兩個數字
*
* 題目一分析:
* 相關數字的二進制表示為:
* 2 = 0010 3 = 0011 4 = 0100
* 5 = 0101 6 = 0110
*
* 步驟1 全體異或:2^4^3^6^3^2^5^5 = 4^6 = 0010
* 步驟2 確定位置:對于0010,從右數的第二位為1,因此可以根據倒數第2位是否為1進行分組
* 步驟3 進行分組:分成[2,3,6,3,2]和[4,5,5]兩組
* 步驟4 分組異或:2^3^6^3^2 = 6,4^5^5 = 4,因此結果為4,6。
*
* 題目二: 數組中唯一只出現一次的數字
*
* 分析: 基于位運算,若一個數字出現三次,那么它的二進制表示中的每一位也出現三次。把
* 數組中的所有出現三次的數字的二進制表示的每一位分別加起來,則每一位的和都能被3整除,
* 再把所求的那個數字的每一位分別加上去,若二進制對應位的和還能被3整除,則所求數字對
* 應位為0,否則為1。最終,得到所求數字的二進制表示。********************************************************************/class Sulotion {
public:// 題目一:數組中只出現一次的兩個數字unsigned int FindFirstBitIs1(int num) {int indexBit = 0;while (((num & 1) == 0) && (indexBit < 8 * sizeof(int))) {num = num >> 1;++indexBit;}return indexBit;}bool IsBit1(int num, unsigned int indexBit) {num = num >> indexBit;return (num & 1);}void FindNumsAppearOnce(int data[], int length, int* num1, int* num2) {if (data == nullptr || length < 2)return;int resultExclusiveOR = 0;for (int i = 0; i < length; ++i)resultExclusiveOR ^= data[i];unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);*num1 = *num2 = 0;for (int j = 0; j < length; ++j) {if (IsBit1(data[j], indexOf1))*num1 ^= data[j];else*num2 ^= data[j];}}// 題目二: 數組中唯一只出現一次的數字int FindNumberAppearingOnce(int numbers[], int length) {if (numbers == nullptr || length <= 0)return -1;int bitSum[32] = { 0 };for (int i = 0; i < length; ++i) {int bitMask = 1;for (int j = 31; j >= 0; --j) {int bit = numbers[i] & bitMask;if (bit != 0) {bitSum[j] += 1;bitMask = bitMask << 1;}}int result = 0;for (int i = 0; i < 32; ++i) {result = result << 1;result += bitSum[i] % 3;}return result;}}};
轉載于:https://www.cnblogs.com/htfeng/p/9933503.html
總結
以上是生活随笔為你收集整理的面试题56: 数组中数字出现的次数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis存储的数据类型
- 下一篇: python之路-day18-反射