LeetCode ---- Single Number (Java/Lua 實現)

問題:

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?

給定一個數組,數組裏只有一個數值只出現一次,其他都是出現 2 次,找到這個出現一次的位置。

時間複雜度是線性的,能否嘗試不用藉助其他空間來實現?


Java 實現代碼:

public static int singleNumber(int[] nums) {


    // 1. 常規解法,要藉助額外的空間
    /**
    Set<Integer> sets= new HashSet<Integer>();
    for (int i = 0; i < nums.length; i++) {
        if (!sets.contains(nums[i]))
            sets.add(nums[i]);
        else
            sets.remove(nums[i]);
    }
    return sets.iterator().next();
     **/

    // 藉助 XOR 特性,當兩個二進制值不同的時候返回 1
    // 因爲A XOR A = 0,且XOR運算是可交換的,於是,對於實例{2,1,4,5,2,4,1}就會有這樣的結果:
    // (2^1^4^5^2^4^1) => ((2^2)^(1^1)^(4^4)^(5)) => (0^0^0^5) => 5
    int result = 0;
    for (int i = 0; i < nums.length; i++) {
        result ^= nums[i];
    }
    return result;

}


Lua 實現代碼: Lua 5.3 纔有原生的二進制操作, ~ 代表了 xor

function singleNumber(nums)
     assert(type(nums) == "table", "nums 不是 table 類型")
     result = 0
     for i = 1, #nums do
         print(result .. nums[i])
         result = result ~ nums[i]
     end
     return result;
 end

 print(singleNumber({1}))


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