原题网址:http://www.lintcode.com/zh-cn/problem/single-number/#
给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。
标签
非挑战AC代码:
思路是先排序,然后相邻元素做减法,差值不为零说明是落单的数。这里注意遍历时最后一个元素访问不到,如果之前未找到落单的数,就要返回最后一个元素,该元素一定是落单的数。
1 class Solution {
2 public:
3 /**
4 * @param A: An integer array
5 * @return: An integer
6 */
7 int singleNumber(vector<int> &A) {
8 // write your code here
9 if (A.empty())
10 {
11 return NULL;
12 }
13 sort(A.begin(),A.end());
14 for (int i=0;i<(int)A.size()-1;i+=2)
15 {
16 if (A[i]-A[i+1]!=0)
17 {
18 return A[i];
19 }
20 }
21 return A[A.size()-1];
22 }
23 };
挑战版:
参考:https://www.cnblogs.com/hujunzheng/p/5045084.html
通过异或,相同的数结果为0,那么最后的结果一定是落单的数字。
关于异或:参考——有关异或符号'^'在c++编程中的应用的讲解!!!
异或^是位运算。
它的简单规则是相同为0,不同为1,例如
int a=3=011(2进制,在计算机中的存储形式);
int b=6=110(2进制,在计算机中的存储形式);
int c=a^b=101=5;
切忌,在异或门的计算中都是应用的2进制!!
任何数和0异或都等于它本身;两个相同的数异或后的结果是0;
1 class Solution {
2 public:
3 /**
4 * @param A: An integer array
5 * @return: An integer
6 */
7 int singleNumber(vector<int> &A) {
8 // write your code here
9 int result=0;
10 for (int i=0;i<(int)A.size();i++)
11 {
12 result=result^A[i];
13 }
14 return result;
15 }
16 };
其他参考:C++ 异或运算
C++ 按位与、或、异或等运算方法