import java.util.*;
import java.lang.*;
import java.io.*;
// Problem Description:
// Reorder the digits of a number, in order to
// get the least one which is greater than the input number
class Ideone
{
public static String getLeastGreaterNumber(String number) {
List<Character> decreasingChars = new ArrayList();
int firstDecreasing = getDecreasingChars(number, decreasingChars);
if(isGreatestNumber(firstDecreasing)) {
return "";
}
String prefix = "";
if(firstDecreasing > 1) {
prefix = number.substring(0, firstDecreasing - 1);
}
StringBuilder resultBuilder = new StringBuilder(prefix);
char target = number.charAt(firstDecreasing - 1);
char leastGreater = swapLeastGreater(decreasingChars, target);
resultBuilder.append(leastGreater);
Collections.sort(decreasingChars);
appendList(resultBuilder, decreasingChars);
return resultBuilder.toString();
}
private static Boolean isGreatestNumber(int firstDecreasing) {
return firstDecreasing == 0;
}
private static int getDecreasingChars(String number, List<Character> decreasing) {
int firstDecreasing = number.length() - 1;
for(; firstDecreasing > 0; --firstDecreasing) {
char curChar = number.charAt(firstDecreasing);
char preChar = number.charAt(firstDecreasing - 1);
decreasing.add(curChar);
if(curChar > preChar) {
break;
}
}
return firstDecreasing;
}
private static char swapLeastGreater(List<Character> chars, char target) {
Iterator it=chars.iterator();
char finding = '9';
while(it.hasNext()) {
char value = ((Character)it.next()).charValue();
if(value > target && value < finding) {
finding = value;
}
}
chars.remove(new Character(finding));
chars.add(new Character(target));
return finding;
}
private static void appendList(StringBuilder str, List<Character> chars) {
Iterator it=chars.iterator();
while(it.hasNext()) {
char value = ((Character)it.next()).charValue();
str.append(value);
}
}
//////////////////////////////////////////////////////////////
// Test Code Begins
//////////////////////////////////////////////////////////////
private static void test(String number, String expected) {
String result = getLeastGreaterNumber(number);
if(result.equals(expected)) {
System.out.println("Test passed with number " + number);
}
else {
System.out.println("Test FAILED with number " + number);
}
}
private static void test1() {
String number = "38276";
String expected = "38627";
test(number, expected);
}
private static void test2() {
String number = "34722641";
String expected = "34724126";
test(number, expected);
}
private static void test3() {
String number = "12345";
String expected = "12354";
test(number, expected);
}
private static void test4() {
String number = "987654";
String expected = "";
test(number, expected);
}
private static void test5() {
String number = "6";
String expected = "";
test(number, expected);
}
private static void test6() {
String number = "111111";
String expected = "";
test(number, expected);
}
private static void test7() {
String number = "111222333";
String expected = "111223233";
test(number, expected);
}
private static void test8() {
String number = "333222111";
String expected = "";
test(number, expected);
}
private static void test9() {
String number = "8987654321";
String expected = "9123456788";
test(number, expected);
}
public static void main (String[] args) {
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovLyBQcm9ibGVtIERlc2NyaXB0aW9uOiAKLy8gUmVvcmRlciB0aGUgZGlnaXRzIG9mIGEgbnVtYmVyLCBpbiBvcmRlciB0byAKLy8gZ2V0IHRoZSBsZWFzdCBvbmUgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dCBudW1iZXIKCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMZWFzdEdyZWF0ZXJOdW1iZXIoU3RyaW5nIG51bWJlcikgewoJCUxpc3Q8Q2hhcmFjdGVyPiBkZWNyZWFzaW5nQ2hhcnMgPSBuZXcgQXJyYXlMaXN0KCk7CgkJaW50IGZpcnN0RGVjcmVhc2luZyA9IGdldERlY3JlYXNpbmdDaGFycyhudW1iZXIsIGRlY3JlYXNpbmdDaGFycyk7CgoJCWlmKGlzR3JlYXRlc3ROdW1iZXIoZmlyc3REZWNyZWFzaW5nKSkgewoJCQlyZXR1cm4gIiI7CgkJfQoJCQoJCVN0cmluZyBwcmVmaXggPSAiIjsKCQlpZihmaXJzdERlY3JlYXNpbmcgPiAxKSB7CgkJCXByZWZpeCA9IG51bWJlci5zdWJzdHJpbmcoMCwgZmlyc3REZWNyZWFzaW5nIC0gMSk7CgkJfQoJCQoJCVN0cmluZ0J1aWxkZXIgcmVzdWx0QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHByZWZpeCk7CgkJCgkJY2hhciB0YXJnZXQgPSBudW1iZXIuY2hhckF0KGZpcnN0RGVjcmVhc2luZyAtIDEpOwoJCWNoYXIgbGVhc3RHcmVhdGVyID0gc3dhcExlYXN0R3JlYXRlcihkZWNyZWFzaW5nQ2hhcnMsIHRhcmdldCk7CgkJcmVzdWx0QnVpbGRlci5hcHBlbmQobGVhc3RHcmVhdGVyKTsKCQkKCQlDb2xsZWN0aW9ucy5zb3J0KGRlY3JlYXNpbmdDaGFycyk7CgkJYXBwZW5kTGlzdChyZXN1bHRCdWlsZGVyLCBkZWNyZWFzaW5nQ2hhcnMpOwoKCQlyZXR1cm4gcmVzdWx0QnVpbGRlci50b1N0cmluZygpOwoJfQoJCglwcml2YXRlIHN0YXRpYyBCb29sZWFuIGlzR3JlYXRlc3ROdW1iZXIoaW50IGZpcnN0RGVjcmVhc2luZykgewoJCXJldHVybiBmaXJzdERlY3JlYXNpbmcgPT0gMDsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgaW50IGdldERlY3JlYXNpbmdDaGFycyhTdHJpbmcgbnVtYmVyLCBMaXN0PENoYXJhY3Rlcj4gZGVjcmVhc2luZykgewoJCWludCBmaXJzdERlY3JlYXNpbmcgPSBudW1iZXIubGVuZ3RoKCkgLSAxOwoJCQoJCWZvcig7IGZpcnN0RGVjcmVhc2luZyA+IDA7IC0tZmlyc3REZWNyZWFzaW5nKSB7CgkJCWNoYXIgY3VyQ2hhciA9IG51bWJlci5jaGFyQXQoZmlyc3REZWNyZWFzaW5nKTsKCQkJY2hhciBwcmVDaGFyID0gbnVtYmVyLmNoYXJBdChmaXJzdERlY3JlYXNpbmcgLSAxKTsKCQkJZGVjcmVhc2luZy5hZGQoY3VyQ2hhcik7CgkJCQoJCQlpZihjdXJDaGFyID4gcHJlQ2hhcikgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJCgkJcmV0dXJuIGZpcnN0RGVjcmVhc2luZzsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgY2hhciBzd2FwTGVhc3RHcmVhdGVyKExpc3Q8Q2hhcmFjdGVyPiBjaGFycywgY2hhciB0YXJnZXQpIHsKCQlJdGVyYXRvciBpdD1jaGFycy5pdGVyYXRvcigpOwoJCWNoYXIgZmluZGluZyA9ICc5JzsKCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKCQkJY2hhciB2YWx1ZSA9ICgoQ2hhcmFjdGVyKWl0Lm5leHQoKSkuY2hhclZhbHVlKCk7CgkJCWlmKHZhbHVlID4gdGFyZ2V0ICYmIHZhbHVlIDwgZmluZGluZykgewoJCQkJZmluZGluZyA9IHZhbHVlOwoJCQl9CgkJfQogICAgICAgIAoJCWNoYXJzLnJlbW92ZShuZXcgQ2hhcmFjdGVyKGZpbmRpbmcpKTsKCQljaGFycy5hZGQobmV3IENoYXJhY3Rlcih0YXJnZXQpKTsKCgkJcmV0dXJuIGZpbmRpbmc7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kTGlzdChTdHJpbmdCdWlsZGVyIHN0ciwgTGlzdDxDaGFyYWN0ZXI+IGNoYXJzKSB7CgkJSXRlcmF0b3IgaXQ9Y2hhcnMuaXRlcmF0b3IoKTsKCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKCQkJY2hhciB2YWx1ZSA9ICgoQ2hhcmFjdGVyKWl0Lm5leHQoKSkuY2hhclZhbHVlKCk7CgkJCXN0ci5hcHBlbmQodmFsdWUpOwoJCX0KCX0KCQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vIFRlc3QgQ29kZSBCZWdpbnMKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCglwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QoU3RyaW5nIG51bWJlciwgU3RyaW5nIGV4cGVjdGVkKSB7CgkJU3RyaW5nIHJlc3VsdCA9IGdldExlYXN0R3JlYXRlck51bWJlcihudW1iZXIpOwoJCWlmKHJlc3VsdC5lcXVhbHMoZXhwZWN0ZWQpKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQgd2l0aCBudW1iZXIgIiArIG51bWJlcik7CgkJfQoJCWVsc2UgewoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgRkFJTEVEIHdpdGggbnVtYmVyICIgKyBudW1iZXIpOwoJCX0KCX0KCQoJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MSgpIHsKCQlTdHJpbmcgbnVtYmVyID0gIjM4Mjc2IjsKCQlTdHJpbmcgZXhwZWN0ZWQgPSAiMzg2MjciOwoJCXRlc3QobnVtYmVyLCBleHBlY3RlZCk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDIoKSB7CgkJU3RyaW5nIG51bWJlciA9ICIzNDcyMjY0MSI7CgkJU3RyaW5nIGV4cGVjdGVkID0gIjM0NzI0MTI2IjsKCQl0ZXN0KG51bWJlciwgZXhwZWN0ZWQpOwoJfQoJCglwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QzKCkgewoJCVN0cmluZyBudW1iZXIgPSAiMTIzNDUiOwoJCVN0cmluZyBleHBlY3RlZCA9ICIxMjM1NCI7CgkJdGVzdChudW1iZXIsIGV4cGVjdGVkKTsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0NCgpIHsKCQlTdHJpbmcgbnVtYmVyID0gIjk4NzY1NCI7CgkJU3RyaW5nIGV4cGVjdGVkID0gIiI7CgkJdGVzdChudW1iZXIsIGV4cGVjdGVkKTsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0NSgpIHsKCQlTdHJpbmcgbnVtYmVyID0gIjYiOwoJCVN0cmluZyBleHBlY3RlZCA9ICIiOwoJCXRlc3QobnVtYmVyLCBleHBlY3RlZCk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDYoKSB7CgkJU3RyaW5nIG51bWJlciA9ICIxMTExMTEiOwoJCVN0cmluZyBleHBlY3RlZCA9ICIiOwoJCXRlc3QobnVtYmVyLCBleHBlY3RlZCk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDcoKSB7CgkJU3RyaW5nIG51bWJlciA9ICIxMTEyMjIzMzMiOwoJCVN0cmluZyBleHBlY3RlZCA9ICIxMTEyMjMyMzMiOwoJCXRlc3QobnVtYmVyLCBleHBlY3RlZCk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDgoKSB7CgkJU3RyaW5nIG51bWJlciA9ICIzMzMyMjIxMTEiOwoJCVN0cmluZyBleHBlY3RlZCA9ICIiOwoJCXRlc3QobnVtYmVyLCBleHBlY3RlZCk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDkoKSB7CgkJU3RyaW5nIG51bWJlciA9ICI4OTg3NjU0MzIxIjsKCQlTdHJpbmcgZXhwZWN0ZWQgPSAiOTEyMzQ1Njc4OCI7CgkJdGVzdChudW1iZXIsIGV4cGVjdGVkKTsKCX0KCQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKCQl0ZXN0MSgpOwoJCXRlc3QyKCk7CgkJdGVzdDMoKTsKCQl0ZXN0NCgpOwoJCXRlc3Q1KCk7CgkJdGVzdDYoKTsKCQl0ZXN0NygpOwoJCXRlc3Q4KCk7CgkJdGVzdDkoKTsKCX0KfQ==