LeetCode-136只出現一次的數字

題目描述:

     給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

分析:

    也就是說,一個非空數組中的元素只有一個元素只出現一次,其他都是成對出現的,現在就是要找出這個單飛的元素。

解法:

方法一:使用Set

 思路:利用Set接口的特點:相同的值只能插入一次。

將數組裏的每一個元素從前往後依次添加到set中,如果返回值是false,則表示set中已經有了該元素,所以將set中的這個元素刪掉;反之將元素插入set中。

代碼:

class Solution {
        public int singleNumber(int[] nums) {
        Set<Integer> s=new HashSet<>();
        for(int i=0;i<nums.length;i++)
        {
            //如果添加成功了表示只有一個
            //如果添加不成功就把set裏邊的刪掉
            if(!s.add(nums[i]))
            {
                s.remove(nums[i]);
            }
        }
        Object[] o=s.toArray();
        return (int)o[0];
    }
}

分析:該算法的空間複雜度爲O(N),時間複雜度爲O(N);效率不是很好,但還有另一種比較巧合的方法空間複雜度達到O(1);

方法二:異或

我們都知道異或的結論:相同爲0,不同爲1

所以比如 [1 2 2 4 1],如下圖異或結果爲:4

代碼:

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

分析:通過異或的結論來實現該算法空間複雜度爲O(1)。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章