1. 程式人生 > 資訊 >5G 智慧手機出貨量下滑之際,4G 手機逆勢反彈原因何在?

5G 智慧手機出貨量下滑之際,4G 手機逆勢反彈原因何在?

劍指 Offer 56 - I. 陣列中數字出現的次數

題目

連結

https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/

問題描述

一個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。

示例

輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]

提示

2 <= nums.length <= 10000

思路

首先是全部異或,就可以得到這兩個數字的異或。

之後對於這個值,左移,找到那位1.

然後以這個新的獲取的值進行計算,分為可以與之為1和不可以的,分成兩類。

然後就可以找到這兩類裡面的數。

複雜度分析

時間複雜度 O(n)
空間複雜度 O(1)

程式碼

Java

    public int[] singleNumbers(int[] nums) {
        int x = 0, y = 0, n = 0, m = 1;
        for (int num : nums) {
            n ^= num;
        }
        while ((n & m) == 0) {
            m <<= 1;
        }
        for (int num : nums) {
            if ((num & m) != 0) {
                x ^= num;
            } else {
                y ^= num;
            }
        }
        return new int[]{x, y};
    }