【算法編程】找出僅僅出現一次的數-singleNumber
阿新 • • 發佈:2017-07-22
integer 異或運算 方法 appear stl 組成原理 滿足 ice turn
題目意思:
一個數值數組中,大部分的數值出現兩次,僅僅有一個數值僅僅出現過一次,求編程求出該數字。
要求,時間復雜度為線性,空間復雜度為O(1).
解題思路:
1.先排序。後查找。
因為排序的最快時間是O(nlogn), 所以這樣的方法不能滿足時間的要求。
2.其他技巧來解決:
依據主要的計算機組成原理的知識。採用”異或運算“來巧妙的完畢。
異或運算非常easy:
0^0=0
1^1=0
1^0=0^1=1
也就是說同樣則為0,不同則為1.
所以不論什麽同樣的兩個數的異或運算值結果為0。
0與不論什麽數進行異或運算等於該值。
所以,我們僅僅須要將全部的數字進行異或運算一次(O(N)),它的結果就是我們要找的。僅僅出現過一次的值。
#include <iostream>
#include<vector>
using namespace std;
//Given an array of integers, every element appears twice except for one. Find that single one.
//Note:
//Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
class Solution {
public :
int singleNumber(vector<int>& nums)
{
vector<int>::iterator it;
it=nums.begin();
int sum=*it;
for (it=nums.begin()+1;it<nums.end();it++)
{
sum=sum^(*it);
}
return sum;
}
};
int main()
{
Solution instance = Solution();
vector <int> nums;
std::vector<int>::iterator it;
it = nums.begin();
int t;
while(cin>>t)
{
it =nums.insert (it,t);
}
cout << instance.singleNumber(nums) << endl;
return 0;
}
【算法編程】找出僅僅出現一次的數-singleNumber