Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. import java.math.*;
  2. import java.util.concurrent.atomic.*;
  3.  
  4. public class Solution {
  5. public String largestNumber(int[] nums) {
  6. if (nums == null || nums.length == 0) {
  7. return "0";
  8. }
  9.  
  10. List<Integer> sortedNums = new ArrayList<Integer>(nums.length);
  11. for (int i = 0; i < nums.length; i++) sortedNums.add(nums[i]);
  12. Collections.sort(sortedNums);
  13. Collections.reverse(sortedNums);
  14.  
  15. Function<List<Integer>, List<Integer>> idx2nums = indexes -> indexes.stream()
  16. .map(i -> sortedNums.get(i))
  17. .collect(Collectors.toList());
  18.  
  19. Function<List<Integer>, BigInteger> nums2bi = indexes -> new BigInteger(indexes.stream()
  20. .map(n -> Integer.toString(n))
  21. .collect(Collectors.joining()));
  22.  
  23. final AtomicReference<BigInteger> refMax = new AtomicReference<>();
  24. final AtomicReference<List<Integer>> refMaxNums = new AtomicReference<List<Integer>>();
  25.  
  26. permutateIndexes(nums.length, indexes -> {
  27. List<Integer> thisNums = idx2nums.apply(indexes);
  28. BigInteger thisNum = nums2bi.apply(thisNums);
  29. if (refMax.get() == null || thisNum.compareTo(refMax.get()) > 0) {
  30. refMax.set(thisNum);
  31. refMaxNums.set(thisNums);
  32. }
  33.  
  34. }, indexes -> {
  35. if (refMaxNums.get() == null) {
  36. return true;
  37. }
  38.  
  39. List<Integer> thisNums = idx2nums.apply(indexes);
  40. List<Integer> maxNums = refMaxNums.get().subList(0, thisNums.size());
  41. if (thisNums.equals(maxNums)) {
  42. return false;
  43. }
  44.  
  45. String thisNum = nums2bi.apply(thisNums).toString();
  46. String maxNum = nums2bi.apply(maxNums).toString();
  47. if (thisNum.length() == maxNum.length()) {
  48. return thisNum.compareTo(maxNum) > 0;
  49. }
  50.  
  51. int minLen = Math.min(thisNum.length(), maxNum.length());
  52. return thisNum.substring(0, minLen).compareTo(maxNum.substring(0, minLen)) >= 0;
  53. });
  54.  
  55. return refMax.get().toString();
  56. }
  57.  
  58. public static void permutateIndexes(int length, Consumer<List<Integer>> consumer,
  59. Predicate<List<Integer>> continueCheck) {
  60. permutateIndexes(length, consumer, continueCheck, new LinkedList<Integer>());
  61. }
  62.  
  63. private static void permutateIndexes(int length, Consumer<List<Integer>> consumer,
  64. Predicate<List<Integer>> continueCheck,
  65. LinkedList<Integer> indexes) {
  66.  
  67. if (indexes == null) {
  68. indexes = new LinkedList<Integer>();
  69.  
  70. } else if (!indexes.isEmpty() && indexes.size() < length) {
  71. if (continueCheck != null && !continueCheck.test(indexes)) {
  72. return;
  73. }
  74.  
  75. } else if (indexes.size() == length) {
  76. consumer.accept(indexes);
  77. return;
  78. }
  79.  
  80. for (int i = 0; i < length; i++) {
  81. if (indexes.contains(i)) {
  82. continue;
  83. }
  84.  
  85. indexes.add(i);
  86. permutateIndexes(length, consumer, continueCheck, indexes);
  87. indexes.removeLast();
  88. }
  89. }
  90.  
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement