使用 Java 計算整數中唯一數字的數量
瀏覽人數:508最近更新:
1. 概述
在這個簡短的教學中,我們將探討如何使用 Java 計算整數中唯一數字的數量。
2. 理解問題
給定一個整數,我們的目標是計算它包含多少個唯一數字。例如,整數 567890 有六個唯一數字,而 115577 只有三個唯一數字(1、5 和 7)。
3. 使用Set
找出整數中唯一位數的最直接方法是使用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)
操作,但我們仍然需要迭代每個數字。
4. 使用串流API
Java 的 Stream API 提供了一個簡潔而現代的解決方案來計算整數中唯一數字的數量。此方法利用流的強大功能以類似集合的方式處理元素序列,包括不同的元素:
public static long countWithStreamApi(int number) {
return String.valueOf(Math.abs(number)).chars().distinct().count();
}
讓我們檢查一下所涉及的步驟:
- 將數字轉換為字串。
- 使用
chars()
方法從字串中取得字元流。 - 使用
distinct()
方法過濾掉重複的數字。 - 使用
count()
方法取得唯一數字的數量。
時間複雜度與第一種方案相同。
5. 使用位元操作
讓我們探索另一種解決方案。位元操作還提供了一種追蹤唯一數字的方法:
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);
}
這次我們的程式碼步驟如下:
- 將整數
mask
初始化為 0。mask
中的每一位將代表 0-9 中的一個數字。 - 迭代數字的每個數字。
- 對於每個數字,建立一個位表示。如果數字為 d,則位表示為 1 << d。
- 使用按位或來更新
mask
。這將數字標記為所見。 - 計算
mask
中設定為 1 的位數。該計數是唯一數字的數量。
時間複雜度也與上述解決方案相同。
六,結論
本文提供了計算整數中唯一數字的數量及其時間複雜度的不同方法。
本文中的範例程式碼可以在 GitHub 上找到。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議