這裏這個題目都是用抑或操作來處理數組裏面的數據。
主要是下面這個公式
// NOTICE : B = A ^ (B ^ A)
第一題
直接上代碼了
#include <iostream>
#include <cstring>
#include <cstdlib>
const int N = 10;
int main()
{
int arr[N];
int len = sizeof(arr) / sizeof(int);
int i = 0;
int res = 0;
for (i = 0; i < N; i++)
{
arr[i] = i + 1;
if (i == 0)
res = i + 1;
else
res ^= i + 1;
}
int arr_data[N+1] = {1, 3, 5, 7, 9, 10, 2, 3, 4, 6, 8};
for (i = 0; i < N+1; i++)
res ^= arr_data[i];
std::cout << "only repeat number: " << res << std::endl;
return 0;
}
上面將N改爲1000即可。
第二題
對於第二題,較爲容易,對整個數據取異或,剩下的那個值就是發生一次的數。
#include <iostream>
#include <cstring>
#include <cstdlib>
const int N = 10;
void quicksort(int arr[], int low, int high)
{
if (low >= high)
return;
int i = low;
int j = high;
int val = arr[j];
while (i < j)
{
while (i < j && arr[i] >= val)
i++;
arr[j] = arr[i];
while (i < j && arr[j] < val)
j--;
arr[i] = arr[j];
}
arr[i] = val;
quicksort(arr, low, i-1);
quicksort(arr, i+1, high);
}
int main()
{
int arr[] = {1, 3, 4, 3, 5, 7, 5, 9, 6, 1, 7, 9, 4};
int len = sizeof(arr) / sizeof(int);
int i = 0;
std::cout << "org data:" << std::endl;
for (i = 0; i < len; i++)
std::cout << arr[i] << " ";
std::cout << std::endl;
/*
quicksort(arr, 0, len-1);
std::cout << "sorted data:" << std::endl;
for (i = 0; i < len; i++)
std::cout << arr[i] << " ";
std::cout << std::endl;
*/
int res = 0;
for (i = 0; i < len; i++)
{
if (i == 0)
res = arr[i];
else
res ^= arr[i];
}
std::cout << "the only number: " << res << std::endl;
return 0;
}
第三題
對於第三題,也是一樣的,先將這個數組分組,分組以後再來獲取相應的值就可以了。
#include <iostream>
#include <cstring>
#include <cstdlib>
const int N = 10;
void quicksort(int arr[], int low, int high)
{
if (low >= high)
return;
int i = low;
int j = high;
int val = arr[j];
while (i < j)
{
while (i < j && arr[i] >= val)
i++;
arr[j] = arr[i];
while (i < j && arr[j] < val)
j--;
arr[i] = arr[j];
}
arr[i] = val;
quicksort(arr, low, i-1);
quicksort(arr, i+1, high);
}
int main()
{
int arr[] = {1, 3, 4, 3, 5, 7, 5, 9, 6, 1, 12, 7, 9, 4};
int len = sizeof(arr) / sizeof(int);
int i = 0;
std::cout << "org data:" << std::endl;
for (i = 0; i < len; i++)
std::cout << arr[i] << " ";
std::cout << std::endl;
/*
quicksort(arr, 0, len-1);
std::cout << "sorted data:" << std::endl;
for (i = 0; i < len; i++)
std::cout << arr[i] << " ";
std::cout << std::endl;
*/
int res = 0;
for (i = 0; i < len; i++)
{
if (i == 0)
res = arr[i];
else
res ^= arr[i];
}
std::cout << "the split number: " << res << std::endl;
int key = 1;
while (1)
{
if (key & res)
break;
else
key <<= 1;
}
std::cout << "the key is " << key << std::endl;
int number1 = 0;
int number2 = 0;
for (i = 0; i < len; i++)
{
if (arr[i] & key) {
if (number1 == 0)
number1 = arr[i];
else
number1 ^= arr[i];
} else {
if (number2 == 0)
number2 = arr[i];
else
number2 ^= arr[i];
}
}
std::cout << "the number which happens once: " << number1 << ", " << number2 << std::endl;
return 0;
}