Java中計算整數中唯一數字數量的3種方法

banq發表於2024-03-06

給定一個整數,我們的目標是計算它包含多少個唯一數字。例如,整數 567890 有六個唯一數字,而 115577 只有三個唯一數字(1、5 和 7)。

1、使用集合
查詢整數中唯一位數的最直接方法是使用Set。集合本質上消除了重複項,這使得它們非常適合我們的用例:

public static int countWithSet(int number) {
    number = Math.abs(number);
    Set<Character> uniqueDigits = new HashSet<>();
    String numberStr = String.valueOf(number);
    for (char digit : numberStr.toCharArray()) {
        uniqueDigits.add(digit);
    }
    return uniqueDigits.size();
}

讓我們分解一下我們的演算法步驟:
  • 將整數轉換為字串以輕鬆迭代每個數字。
  • 迭代字串的每個字元並新增到HashSet中。
  • 迭代後HashSet的大小為我們提供了唯一數字的計數。

該解決方案的時間複雜度為O(n),其中n是整數的位數。新增到HashSet並檢查其大小都是O(1)操作,但我們仍然需要迭代每個數字。

2、使用流API
Java 的Stream API提供了一種簡潔而現代的解決方案來計算整數中唯一數字的數量。此方法利用流的強大功能以類似集合的方式處理元素序列,包括不同的元素:

public static long countWithStreamApi(int number) {
    return String.valueOf(Math.abs(number)).chars().distinct().count();
}
讓我們檢查一下所涉及的步驟:

  • 將數字轉換為字串。
  • 使用chars()方法從字串中獲取字元流。
  • 使用distinct()方法過濾掉重複的數字。
  • 使用count()方法獲取唯一數字的數量。

時間複雜度與第一種方案相同。

3、使用位操作
讓我們探索另一種解決方案。位操作還提供了一種跟蹤唯一數字的方法:

public static int countWithBitManipulation(int number) {
    if (number == 0) {
        return 1;
    }
    number = Math.abs(number);
    int mask = 0;
    while (number > 0) {
        int digit = number % 10;
        mask |= 1 << digit;
        number /= 10;
    }
    return Integer.bitCount(mask);
}

這次我們的程式碼步驟如下:
  • 將整數掩碼初始化為 0。掩碼中的每一位將代表 0-9 中的一個數字。
  • 迭代數字的每個數字。
  • 對於每個數字,建立一個位表示。如果數字為 d,則位表示為 1 << d。
  • 使用按位或來更新mask。這將數字標記為所見。
  • 計算mask中設定為 1 的位數。該計數是唯一數字的數量。

時間複雜度也與上述解決方案相同。

相關文章