For example, given
[3, 30, 34, 5, 9]
, the largest formed number is 9534330
.Note: The result may be very large, so you need to return a string instead of an integer.
public class Solution { public String largestNumber(int[] num) { // Adopt modified LSD (Least-Significant-Digits) algorithm // MSD algorithm is not suitable here // However, LSD requires identical length of every element (String format) // Suppose that the longest length of element is 4, we append any element by itself until the length is 4*2: // "123" ---> "123"+"123"+"12" ---> "12312312" // We can define a "charAt()" function to implement that without actually append the string. int n = num.length; int R = 10; // Only 10 digits: 0, 1, 2, ..., 9 int len = 0; // Max length of elements String[] a = new String[n]; String[] aux = new String[n]; // Convert 'num' to 'a' for (int i = 0; i < n; i++) { a[i] = String.valueOf(num[i]); if (len < a[i].length()) len = a[i].length(); } // Original num: [3, 30, 34, 5, 9] // Result: [30, 3, 34, 5, 9] for (int d = len*2-1; d >= 0; d--) { int[] count = new int[R+1]; // Compute frequency counts for (int i = 0; i < n; i++) count[charAt(a[i], d)+1]++; // Transform counts to indices for (int r = 0; r < R; r++) count[r+1] += count[r]; // Distribute the data for (int i = 0; i < n; i++) aux[count[charAt(a[i], d)]++] = a[i]; // Copy back for (int i = 0; i < n; i++) a[i] = aux[i]; } String result = ""; for (int i = n-1; i >= 0; i--) result += a[i]; // Note: Maybe exist special case: "0000" if (result.length()>1 && result.charAt(0)=='0') result = "0"; return result; } private int charAt(String s, int d) { d = d%s.length(); return s.charAt(d)-'0'; } }
No comments:
Post a Comment