2016-11-07 45 views
5

我的目標是反轉整數在Java中沒有重複數字 如何提高代碼的複雜性或存在一個好的/標準算法?反向整數在java中沒有重複數字

重複數字的櫃面,應該保留最後一位

public static void main(String[] args) { 
    int n = -19890; 
    System.out.println(reverseNumberWithoutDuplicate(n)); 
} 

public static int reverseNumberWithoutDuplicate(int number) { 
    boolean isNegative = (number < 0); 
    number = isNegative ? number * -1 : number; 

    Set<Character> lookup = new HashSet<>(); 

    StringBuffer sb = new StringBuffer(); 
    char[] digits = String.valueOf(number).toCharArray(); 
    for (int i = digits.length - 1; i >= 0; --i) { 
     if (lookup.contains(digits[i])) { 
      continue; 
     } 
     sb.append(digits[i]); 
     lookup.add(digits[i]); 
    } 
    return isNegative ? Integer.parseInt(sb.toString()) * -1 : Integer.parseInt(sb.toString()); 
} 

預期輸出:-981

+1

你可以給你想要的輸出嗎?對於'-19890',你想要'981'還是'891'? –

+1

你是什麼意思「沒有重複號碼」? –

+0

一位數字應該來一次。 –

回答

4

複雜性很好。雖然可以優化。

使用StringBuilder比舊的StringBuffer更好,它具有不需要的開銷(用於線程安全性)。

然後數據可以保持數字,對於十個可能的數字,BitSet就好了。

public static int reverseNumberWithoutDuplicate(int number) { 
    if (number == Integer.MIN_VALUE) { 
     // -2147483648 is a special case, not negatable. 
     return -8463712; 
    } 
    boolean isNegative = number < 0; 
    number = isNegative ? -number : number; 

    BitSet usedDigits = new BitSet(10); 
    int reversedNumber = 0; 
    while (number != 0) { 
     int digit = number % 10; 
     number /= 10; 
     if (!usedDigits.get(digit)) { 
      usedDigits.set(digit); 
      reversedNumber = 10 * reversedNumber + digit; 
     } 
    } 
    return isNegative ? -reversedNumber : reversedNumber; 
} 
+0

輸入:Integer.MIN_VALUE – Durandal

+0

@Durandal(I但是實際上全域解決方案並不難,所以我表示歉意,並加上它 - 作爲特例,以便不處理負模等等。 –

5

讓我們建立一個解決方案一步一步來。以下函數反轉正數的數字。

int reverseNumber(int number) { 
    int answer = 0; 
    for (int n = number; n != 0; n /= 10) { 
     // Digits are taken from least significant to most significant 
     int digit = n % 10; 
     // And added the other way round 
     answer = answer * 10 + digit; 
    } 
    return answer; 
} 

這個代碼可以很容易地適應與負數工作:

int reverseNumber(int number) { 
    if (number < 0) { 
     return -reverseNumber(-number); 
    } 
    // The rest is the same 

我們的下一個目標 - 跳過重複的數字。我們將跟蹤boolean[] seen中已經看到的數字的列表。

private static int reverseNumberWithoutDuplicate(int number) { 
    if (number < 0) { 
     return -reverseNumberWithoutDuplicate(-number); 
    } 

    boolean[] seen = new boolean[10]; 
    int answer = 0; 
    for (int n = number; n != 0; n /= 10) { 
     int digit = n % 10;    
     if (!seen[digit]) { 
      seen[digit] = true; 
      answer = answer * 10 + digit; 
     } 
    } 
    return answer; 
}