/**
*
*/
import static java.
lang.
System.
out;
import java.util.ArrayList;
import java.util.List;
/**
* @description 0~9 挑k個數字, 組出最接近 A 的數字
* input(A, k)
* 1 <= A <= 10^15, 1<=k<=10
*
*
*/
public class Main {
/**
* @param args
*/
private static String strOrigA
;
private static int origK;
private static List<Integer> listCandidateDigits;
private static List<Long> listCandidateA;
public static void main
(String[] args
) {
long A = 3355798521L;
int k = 5;
// long A = 3355798521L;
// int k = 10;
// long A = 262004L;
// int k = 2;
// long A = 8000L;
// int k = 1;
// long A = 1000L;
// int k = 1;
// long A = 2243L;
// int k = 2;
// long A = 88449L;
// int k = 2;
// long A = 123456789L;
// int k = 1;
out.println(input(A, k));
}
private static void recur
(StringBuffer sbHead,
int x,
int k,
boolean flag
) { if(flag) {
if(x == strOrigA.length()) {
if(countDigits(sbHead.toString()) <= origK) {
listCandidateA.
add(Long.
parseLong(sbHead.
toString())); }
} else {
for(Integer i
: listCandidateDigits
) { }
}
} else {
if(k == 0) {
if(x == strOrigA.length()) {
listCandidateA.
add(Long.
parseLong(sbHead.
toString())); } else {
if(listCandidateDigits.
contains(new Integer(strOrigA.
charAt(x
)))) { recur
((new StringBuffer(sbHead
)).
append(strOrigA.
charAt(x
)), x
+ 1,
0,
false); } else {
for(Integer i
: listCandidateDigits
) { }
}
}
} else if(k == 1) {
int iLeftmost = strOrigA.charAt(x) - '0';
// for special case
if(sbHead.length() == 0 && iLeftmost - 1 == 0) {
int iBorrowDigit = strOrigA.charAt(x + 1) - '0';
if(iLeftmost * 10 + iBorrowDigit == 10) {
for(int i = x + 1; i < strOrigA.length(); ++i) {
sbHead.append("9");
}
listCandidateA.
add(Long.
parseLong(sbHead.
toString())); return;
} else {
listCandidateDigits.
add(new Integer(iLeftmost
)); recur
((new StringBuffer(sbHead
)).
append(iLeftmost
), x
+ 1,
0,
false);
listCandidateDigits.
add(new Integer(9)); recur
((new StringBuffer(sbHead
)).
append(9), x
+ 2,
0,
false); }
}
if(listCandidateDigits.
contains(new Integer(iLeftmost
))) { recur
((new StringBuffer(sbHead
)).
append(iLeftmost
), x
+ 1,
1,
false); } else {
listCandidateDigits.
add(new Integer(iLeftmost
)); recur
((new StringBuffer(sbHead
)).
append(iLeftmost
), x
+ 1,
0,
false); if(iLeftmost - 1 >= 0) {
listCandidateDigits.
add(new Integer(iLeftmost
- 1)); recur
((new StringBuffer(sbHead
)).
append(iLeftmost
- 1), x
+ 1,
0,
false); }
}
} else {
int iLeftmost = strOrigA.charAt(x) - '0';
if(listCandidateDigits.
contains(new Integer(iLeftmost
))) { recur
((new StringBuffer(sbHead
)).
append(iLeftmost
), x
+ 1, k,
false); } else {
listCandidateDigits.
add(new Integer(iLeftmost
)); recur
((new StringBuffer(sbHead
)).
append(iLeftmost
), x
+ 1, k
- 1,
false); }
}
}
}
private static long input(long A, int k) {
strOrigA = "" + A;
if(countDigits(strOrigA) <= k) {
return A;
}
origK = k;
listCandidateA = new ArrayList<Long>();
listCandidateDigits = new ArrayList<Integer>();
long answer = -1L;
if(listCandidateA.size() > 0) {
answer = listCandidateA.get(0);
long distance
= Math.
abs(answer
- A
); for(int i = 1; i < listCandidateA.size(); ++i) {
long tmp
= Math.
abs(listCandidateA.
get(i
) - A
); if(tmp < distance) {
distance = tmp;
answer = listCandidateA.get(i);
}
}
}
return answer;
}
/**
* 回傳listOrig用到的數字List
*
* @param List<Integer>
* @return List<Integer>
*/
private static int countDigits
(String strOrig
) { boolean ary[] = new boolean[10];
int len = strOrig.codePointCount(0, strOrig.length());
for(int i = 0; i < len; ++i) {
int x = strOrig.codePointAt(i) - '0';
if(x < 10 && false == ary[x]) {
ary[x] = true;
sb.append(x);
}
}
return sb.length();
}
}
LyoqCiAqIAogKi8KCmltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS5vdXQ7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKLyoqCiAqIEBkZXNjcmlwdGlvbiAw772eOSDmjJFr5YCL5pW45a2XLCDntYTlh7rmnIDmjqXov5EgQSDnmoTmlbjlrZcKICogCQkJCWlucHV0KEEsIGspCiAqIAkJCQkxIDw9IEEgPD0gMTBeMTUsIDE8PWs8PTEwCiAqIAogKgogKi8KcHVibGljIGNsYXNzIE1haW4gewoKCS8qKgoJICogQHBhcmFtIGFyZ3MKCSAqLwoJCglwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyT3JpZ0E7CgkKCXByaXZhdGUgc3RhdGljIGludCBvcmlnSzsKCQoJcHJpdmF0ZSBzdGF0aWMgTGlzdDxJbnRlZ2VyPiBsaXN0Q2FuZGlkYXRlRGlnaXRzOwoJCglwcml2YXRlIHN0YXRpYyBMaXN0PExvbmc+IGxpc3RDYW5kaWRhdGVBOwoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgoJCWxvbmcgQSA9IDMzNTU3OTg1MjFMOwoJCWludCBrID0gNTsKLy8JCWxvbmcgQSA9IDMzNTU3OTg1MjFMOwovLwkJaW50IGsgPSAxMDsKLy8JCWxvbmcgQSA9IDI2MjAwNEw7Ci8vCQlpbnQgayA9IDI7Ci8vCQlsb25nIEEgPSA4MDAwTDsKLy8JCWludCBrID0gMTsKLy8JCWxvbmcgQSA9IDEwMDBMOwovLwkJaW50IGsgPSAxOwovLwkJbG9uZyBBID0gMjI0M0w7Ci8vCQlpbnQgayA9IDI7Ci8vCQlsb25nIEEgPSA4ODQ0OUw7Ci8vCQlpbnQgayA9IDI7Ci8vCQlsb25nIEEgPSAxMjM0NTY3ODlMOwovLwkJaW50IGsgPSAxOwoJCW91dC5wcmludGxuKGlucHV0KEEsIGspKTsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWN1cihTdHJpbmdCdWZmZXIgc2JIZWFkLCBpbnQgeCwgaW50IGssIGJvb2xlYW4gZmxhZykgewoJCWlmKGZsYWcpIHsKCQkJaWYoeCA9PSBzdHJPcmlnQS5sZW5ndGgoKSkgewoJCQkJaWYoY291bnREaWdpdHMoc2JIZWFkLnRvU3RyaW5nKCkpIDw9IG9yaWdLKSB7CgkJCQkJbGlzdENhbmRpZGF0ZUEuYWRkKExvbmcucGFyc2VMb25nKHNiSGVhZC50b1N0cmluZygpKSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IoSW50ZWdlciBpIDogbGlzdENhbmRpZGF0ZURpZ2l0cykgewoJCQkJCXJlY3VyKChuZXcgU3RyaW5nQnVmZmVyKHNiSGVhZCkpLmFwcGVuZChuZXcgSW50ZWdlcihpKSksIHggKyAxLCAwLCB0cnVlKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWlmKGsgPT0gMCkgewoJCQkJaWYoeCA9PSBzdHJPcmlnQS5sZW5ndGgoKSkgewoJCQkJCWxpc3RDYW5kaWRhdGVBLmFkZChMb25nLnBhcnNlTG9uZyhzYkhlYWQudG9TdHJpbmcoKSkpOwoJCQkJfSBlbHNlIHsKCQkJCQlpZihsaXN0Q2FuZGlkYXRlRGlnaXRzLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKHN0ck9yaWdBLmNoYXJBdCh4KSkpKSB7CgkJCQkJCSByZWN1cigobmV3IFN0cmluZ0J1ZmZlcihzYkhlYWQpKS5hcHBlbmQoc3RyT3JpZ0EuY2hhckF0KHgpKSwgeCArIDEsIDAsIGZhbHNlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlmb3IoSW50ZWdlciBpIDogbGlzdENhbmRpZGF0ZURpZ2l0cykgewoJCQkJCQkJcmVjdXIoKG5ldyBTdHJpbmdCdWZmZXIoc2JIZWFkKSkuYXBwZW5kKG5ldyBJbnRlZ2VyKGkpKSwgeCArIDEsIDAsIHRydWUpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgaWYoayA9PSAxKSB7CgkJCQlpbnQgaUxlZnRtb3N0ID0gc3RyT3JpZ0EuY2hhckF0KHgpIC0gJzAnOwoJCQkJCgkJCQkvLwlmb3Igc3BlY2lhbCBjYXNlCgkJCQlpZihzYkhlYWQubGVuZ3RoKCkgPT0gMCAmJiBpTGVmdG1vc3QgLSAxID09IDApIHsKCQkJCQlpbnQgaUJvcnJvd0RpZ2l0ID0gc3RyT3JpZ0EuY2hhckF0KHggKyAxKSAtICcwJzsKCQkJCQlpZihpTGVmdG1vc3QgKiAxMCArIGlCb3Jyb3dEaWdpdCA9PSAxMCkgewoJCQkJCQlmb3IoaW50IGkgPSB4ICsgMTsgaSA8IHN0ck9yaWdBLmxlbmd0aCgpOyArK2kpIHsKCQkJCQkJCXNiSGVhZC5hcHBlbmQoIjkiKTsKCQkJCQkJfQoJCQkJCQlsaXN0Q2FuZGlkYXRlQS5hZGQoTG9uZy5wYXJzZUxvbmcoc2JIZWFkLnRvU3RyaW5nKCkpKTsKCQkJCQkJcmV0dXJuOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWxpc3RDYW5kaWRhdGVEaWdpdHMuYWRkKG5ldyBJbnRlZ2VyKGlMZWZ0bW9zdCkpOwoJCQkJCQlyZWN1cigobmV3IFN0cmluZ0J1ZmZlcihzYkhlYWQpKS5hcHBlbmQoaUxlZnRtb3N0KSwgeCArIDEsIDAsIGZhbHNlKTsKCQkJCQkJCgkJCQkJCWxpc3RDYW5kaWRhdGVEaWdpdHMuYWRkKG5ldyBJbnRlZ2VyKDkpKTsKCQkJCQkJcmVjdXIoKG5ldyBTdHJpbmdCdWZmZXIoc2JIZWFkKSkuYXBwZW5kKDkpLCB4ICsgMiwgMCwgZmFsc2UpOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJaWYobGlzdENhbmRpZGF0ZURpZ2l0cy5jb250YWlucyhuZXcgSW50ZWdlcihpTGVmdG1vc3QpKSkgewoJCQkJCXJlY3VyKChuZXcgU3RyaW5nQnVmZmVyKHNiSGVhZCkpLmFwcGVuZChpTGVmdG1vc3QpLCB4ICsgMSwgMSwgZmFsc2UpOwoJCQkJfSBlbHNlIHsKCQkJCQlsaXN0Q2FuZGlkYXRlRGlnaXRzLmFkZChuZXcgSW50ZWdlcihpTGVmdG1vc3QpKTsKCQkJCQlyZWN1cigobmV3IFN0cmluZ0J1ZmZlcihzYkhlYWQpKS5hcHBlbmQoaUxlZnRtb3N0KSwgeCArIDEsIDAsIGZhbHNlKTsKCQkJCQlpZihpTGVmdG1vc3QgLSAxID49IDApIHsKCQkJCQkJbGlzdENhbmRpZGF0ZURpZ2l0cy5hZGQobmV3IEludGVnZXIoaUxlZnRtb3N0IC0gMSkpOwoJCQkJCQlyZWN1cigobmV3IFN0cmluZ0J1ZmZlcihzYkhlYWQpKS5hcHBlbmQoaUxlZnRtb3N0IC0gMSksIHggKyAxLCAwLCBmYWxzZSk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaW50IGlMZWZ0bW9zdCA9IHN0ck9yaWdBLmNoYXJBdCh4KSAtICcwJzsKCQkJCWlmKGxpc3RDYW5kaWRhdGVEaWdpdHMuY29udGFpbnMobmV3IEludGVnZXIoaUxlZnRtb3N0KSkpIHsKCQkJCQlyZWN1cigobmV3IFN0cmluZ0J1ZmZlcihzYkhlYWQpKS5hcHBlbmQoaUxlZnRtb3N0KSwgeCArIDEsIGssIGZhbHNlKTsKCQkJCX0gZWxzZSB7CgkJCQkJbGlzdENhbmRpZGF0ZURpZ2l0cy5hZGQobmV3IEludGVnZXIoaUxlZnRtb3N0KSk7CgkJCQkJcmVjdXIoKG5ldyBTdHJpbmdCdWZmZXIoc2JIZWFkKSkuYXBwZW5kKGlMZWZ0bW9zdCksIHggKyAxLCBrIC0gMSwgZmFsc2UpOwoJCQkJfQoJCQl9CgkJfQoJfQoJCgkKCQoJcHJpdmF0ZSBzdGF0aWMgbG9uZyBpbnB1dChsb25nIEEsIGludCBrKSB7CgkJc3RyT3JpZ0EgPSAiIiArIEE7CgkJaWYoY291bnREaWdpdHMoc3RyT3JpZ0EpIDw9IGspIHsKCQkJcmV0dXJuIEE7CgkJfQoJCW9yaWdLID0gazsKCQlsaXN0Q2FuZGlkYXRlQSA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKCQlsaXN0Q2FuZGlkYXRlRGlnaXRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwoJCXJlY3VyKG5ldyBTdHJpbmdCdWZmZXIoKSwgMCwgaywgZmFsc2UpOwoJCQoJCQoJCWxvbmcgYW5zd2VyID0gLTFMOwoJCWlmKGxpc3RDYW5kaWRhdGVBLnNpemUoKSA+IDApIHsKCQkJYW5zd2VyID0gbGlzdENhbmRpZGF0ZUEuZ2V0KDApOwoJCQlsb25nIGRpc3RhbmNlID0gTWF0aC5hYnMoYW5zd2VyIC0gQSk7CgkJCWZvcihpbnQgaSA9IDE7IGkgPCBsaXN0Q2FuZGlkYXRlQS5zaXplKCk7ICsraSkgewoJCQkJbG9uZyB0bXAgPSBNYXRoLmFicyhsaXN0Q2FuZGlkYXRlQS5nZXQoaSkgLSBBKTsKCQkJCWlmKHRtcCA8IGRpc3RhbmNlKSB7CgkJCQkJZGlzdGFuY2UgPSB0bXA7CgkJCQkJYW5zd2VyID0gbGlzdENhbmRpZGF0ZUEuZ2V0KGkpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXJldHVybiBhbnN3ZXI7Cgl9CgkKCS8qKgoJICog5Zue5YKzbGlzdE9yaWfnlKjliLDnmoTmlbjlrZdMaXN0CgkgKiAKCSAqIEBwYXJhbSBMaXN0PEludGVnZXI+CgkgKiBAcmV0dXJuIExpc3Q8SW50ZWdlcj4KCSAqLwoJcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50RGlnaXRzKFN0cmluZyBzdHJPcmlnKSB7CgkJYm9vbGVhbiBhcnlbXSA9IG5ldyBib29sZWFuWzEwXTsKCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgkJaW50IGxlbiA9IHN0ck9yaWcuY29kZVBvaW50Q291bnQoMCwgc3RyT3JpZy5sZW5ndGgoKSk7CgkJZm9yKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CgkJCWludCB4ID0gc3RyT3JpZy5jb2RlUG9pbnRBdChpKSAtICcwJzsKCQkJaWYoeCA8IDEwICYmIGZhbHNlID09IGFyeVt4XSkgewoJCQkJYXJ5W3hdID0gdHJ1ZTsKCQkJCXNiLmFwcGVuZCh4KTsKCQkJfQoJCX0KCQlyZXR1cm4gc2IubGVuZ3RoKCk7Cgl9Cn0K