Inverse integer without double digit in java

My goal is to cancel an integer without a double digit in Java How to improve code complexity or is there a good / standard algorithm?

Insert a double digit, it should save the last digit

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()); } 

Expected Result: -981

+5
source share
2 answers

The difficulty is in order. Although this can be optimized.

Using StringBuilder is better than the previous StringBuffer, which has unnecessary overhead (to ensure thread safety).

Then the data can remain numerical, and for ten possible digits, bit-bit is just fine.

 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; } 
+4
source

Build a solution step by step. The following function changes the digits of a positive number.

 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; } 

This code can be easily adapted to work with negative numbers:

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

Our next goal is to skip duplicate numbers. We will track the list of already seen digits in 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; } 
+5
source

Source: https://habr.com/ru/post/1259417/


All Articles