package com.anuragkapur.leetcode;
import java.util.Arrays;
import java.util.Comparator;
/**
* @author anuragkapur
*/
public class LargestNumber {
/**
* Run time complexity: O( kn log(n)), where k is the avg length of numbers and n is the no. of numbers
*
* @param nums
* @return
*/
public String largestNumber(int[] nums) {
if (nums == null) {
return null;
}
Comparator<String> comparator = (s1, s2) -> {
if (s1.equals(s2)) return 0;
String option1 = s1+s2;
String option2 = s2+s1;
char chars1[] = option1.toCharArray();
char chars2[] = option2.toCharArray();
for (int i = 0; i < chars1.length; i++) {
if (chars1[i] > chars2[i]) {
// option1 gives desired result => s1 > s2 => s1 - s2 should be positive. For reverse order return
// -1
return -1;
} else if (chars1[i] < chars2[i]) {
return 1;
}
}
return 0;
};
StringBuilder builder = new StringBuilder();
Arrays.stream(nums).mapToObj(String::valueOf).sorted(comparator).forEach(builder::append);
String intermediateAnswer = builder.toString();
// strip leading 0's
builder = new StringBuilder();
boolean leadingZero = true;
for (char ch : intermediateAnswer.toCharArray()) {
if (ch != '0') {
leadingZero = false;
}
if (!leadingZero) {
builder.append(ch);
}
}
return builder.toString().equals("") ? "0" : builder.toString();
}
}