給定一個整數,我們的目標是計算它包含多少個唯一數字。例如,整數 567890 有六個唯一數字,而 115577 只有三個唯一數字(1、5 和 7)。
1、使用集合
查詢整數中唯一位數的最直接方法是使用Set。集合本質上消除了重複項,這使得它們非常適合我們的用例:
public static int countWithSet(int number) { |
讓我們分解一下我們的演算法步驟:
- 將整數轉換為字串以輕鬆迭代每個數字。
- 迭代字串的每個字元並新增到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) { |
這次我們的程式碼步驟如下:
- 將整數掩碼初始化為 0。掩碼中的每一位將代表 0-9 中的一個數字。
- 迭代數字的每個數字。
- 對於每個數字,建立一個位表示。如果數字為 d,則位表示為 1 << d。
- 使用按位或來更新mask。這將數字標記為所見。
- 計算mask中設定為 1 的位數。該計數是唯一數字的數量。
時間複雜度也與上述解決方案相同。