fork download
  1. import java.util.*;
  2. import java.io.*;
  3. import java.lang.*;
  4.  
  5. class Main
  6. {
  7. public static void main (String[] args) throws java.lang.Exception
  8. {
  9. int t = Integer.parseInt(reader.readLine());
  10. int[] input;
  11. for (int i = 1; i <= t; i++) {
  12. reader.readLine();
  13. input = Arrays.stream(reader.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
  14. System.out.println(nextHigherNumber(input));
  15. }
  16. }
  17.  
  18. private static long nextHigherNumber(int[] number) {
  19. // starting from right, find the case where left number is less than right
  20. int i;
  21. for (i = number.length - 1; i > 0; i--) {
  22. if (number[i - 1] < number[i]) {
  23. break;
  24. }
  25. }
  26.  
  27. if (i == 0)
  28. return -1;
  29.  
  30. i--;
  31. // find the next higher number than number[i]
  32. int nextMaxIdx = 0;
  33. int leastDiff = 9-0;
  34. int currentDiff;
  35. for (int j = i + 1; j < number.length; j++) {
  36. currentDiff = (number[j] - number[i]);
  37. if (number[j] > number[i] && currentDiff<leastDiff) {
  38. leastDiff = currentDiff;
  39. nextMaxIdx = j;
  40. }
  41. }
  42.  
  43. // swap
  44. int temp = number[i];
  45. number[i] = number[nextMaxIdx];
  46. number[nextMaxIdx] = temp;
  47.  
  48. // sort the rest of array
  49. Arrays.sort(number, i + 1, number.length);
  50.  
  51. return intArrayToNumber(number);
  52. }
  53.  
  54. private static long intArrayToNumber(int[] number) {
  55. long result = 0L;
  56. long placeMultiplier = 1L;
  57. for (int i = number.length - 1; i >= 0; i--) {
  58. result += number[i]*placeMultiplier;
  59. placeMultiplier*=10L;
  60. }
  61.  
  62. return result;
  63. }
  64. }
Success #stdin #stdout 0.14s 2184192KB
stdin
1
10
5 6 5 5 5 5 5 5 5 5
stdout
6555555555