1. 程式人生 > >【算法編程】找出僅僅出現一次的數-singleNumber

【算法編程】找出僅僅出現一次的數-singleNumber

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