leetcode----------Single Number

題目 Single Number
經過率 45.1%
難度 Medium

  Given an array of integers, every element appears twice except for one. Find that single one.java

 Note:
 Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?算法

 

  思路:數組

    要求線性時間複雜度,同時空間複雜度O(1),即只容許開常數個空間。app

    最直接的思路是對每個元素嘗試查找是否有重,若是沒有重,就返回。spa

 

java代碼以下:code

  

public class Solution {
    public int singleNumber(int[] nums) {
        int i=0;
        int j=0;
        int n=nums.length;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                if(i==j)
                    continue;
                else if(nums[i]==nums[j])
                    break;
                     else
                     continue;
            }
            if(j==n)
            return nums[i];
        }
        return 0;
    }
}

 

 可是這樣時間複雜度爲o(n2),超時了,因此要想一個O(n)的算法。blog

 

o(n)的算法只能是線性掃描一遍,可能的想法是位運算。對於異或來講:element

1. 異或運算是可交換,即 a ^ b = b ^ a博客

2. 0 ^ a = ait

那麼若是對全部元素作異或運算,其結果爲那個出現一次的元素,理解是a1 ^ a2 ^ ....,能夠將全部相同元素交換至相鄰位置,首先運算相同元素,則會產生(n - 1)/2個0異或積,剩餘一個單一元素,他們的異或積爲這個單一元素本身,得解。

 

java代碼以下:

public class Solution {
    public int singleNumber(int[] nums) {
        if(nums==null || nums.length==0){
            return 0;
        }
        int singleNumber=nums[0];
        for(int i=1;i<nums.length;i++){
            singleNumber=singleNumber ^ nums[i];
        }
        return singleNumber;
    }
}

如下內容摘自他人博客

本題擴展

1.一個數組中有兩個元素只出現一次,其餘全部元素都出現兩次,求這兩個只出現一次的元素

[解題思路]

將數組全部元素都進行異或獲得一個不爲0的結果,根據這個結果中的不爲0的某一位將數組分紅兩組

將兩組中的元素進行異或,如兩個數組的異或值都不爲0,則獲得最後結果

 

2.一個數組中有一個元素只出現1次,其餘全部元素都出現k次,求這個只出現1次的元素

[解題思路]

當k爲偶數時,同lss

當k爲奇數時,將數組中每一個元素的每一位相加mod k,獲得結果即位出現1次的元素,時間複雜度O(nlen),空間複雜度爲O(1)

相關文章
相關標籤/搜索