题目描述
算法分析
提交代码:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
if (data.empty())
return;
int temp = 0;
for (auto iter = data.cbegin(); iter != data.cend(); ++iter)
temp ^= *iter;
// 找到最低位的第一个1
int i = 1;
while ((temp & i) == 0)
i <<= 1;
*num1 = *num2 = 0;
for (auto iter = data.cbegin(); iter != data.cend(); ++iter)
{
if ((*iter & i) == 0)
*num1 ^= *iter;
else
*num2 ^= *iter;
}
}
};
测试代码:
// ====================测试代码====================
void Test(const char* testName, vector<int> data, int expected1, int expected2)
{
if (testName != nullptr)
printf("%s begins: ", testName);
int result1, result2;
Solution s;
s.FindNumsAppearOnce(data, &result1, &result2);
if ((expected1 == result1 && expected2 == result2) ||
(expected2 == result1 && expected1 == result2))
printf("Passed.\n\n");
else
printf("Failed.\n\n");
}
void Test1()
{
vector<int> data = { 2, 4, 3, 6, 3, 2, 5, 5 };
Test("Test1", data, 4, 6);
}
void Test2()
{
vector<int> data = { 4, 6 };
Test("Test2", data, 4, 6);
}
void Test3()
{
vector<int> data = { 4, 6, 1, 1, 1, 1 };
Test("Test3", data, 4, 6);
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
return 0;
}