Google – Next Number
Input一个string表示一个number, number不允许有重复的digit,返回满足要求的next number.
比如输入是789,返回790
比如输入是987,返回1023
[Solution]
Next Permutation的升级版。
从左到右扫一遍,mark用过的digit
从右到左扫,边扫边找比当前digit大且没有用过的digit,找到就break,否则就继续找。但注意在跳到下一个之前,要unmark当前的digit。
Read full article from Google – Next Number
Input一个string表示一个number, number不允许有重复的digit,返回满足要求的next number.
比如输入是789,返回790
比如输入是987,返回1023
[Solution]
Next Permutation的升级版。
从左到右扫一遍,mark用过的digit
从右到左扫,边扫边找比当前digit大且没有用过的digit,找到就break,否则就继续找。但注意在跳到下一个之前,要unmark当前的digit。
- break之后从break的位置开始用first missing number的方法generate后面的digit
- 如果扫到头都没有break,比如987就会是这样的情况,那就说明需要进一位。那么这种情况就是从头开始,generate一个n + 1位的number。
public
String nextNumber(String num) {
if
(num ==
null
|| num.isEmpty()) {
return
num;
}
int
n = num.length();
int
[] map =
new
int
[
10
];
for
(
char
c : num.toCharArray()) {
map[c -
'0'
] =
1
;
}
int
i =
0
;
int
next = -
1
;
for
(i = n -
1
; i >=
0
; i--) {
int
curr = num.charAt(i) -
'0'
;
next = curr +
1
;
while
(next <=
9
&& map[next] ==
1
) {
next++;
}
map[curr] =
0
;
if
(next <=
9
) {
break
;
}
}
StringBuilder sb =
new
StringBuilder();
// 987 -> 1023
if
(i == -
1
) {
sb.append(
"10"
);
int
d =
2
;
while
(sb.length() < n +
1
) {
sb.append(d++);
}
}
else
{
sb.append(num.substring(
0
, i));
sb.append(next);
map[next] =
1
;
next =
0
;
while
(sb.length() < n) {
while
(next <=
9
&& map[next] ==
1
) {
next++;
}
sb.append(next);
map[next] =
1
;
}
}
return
sb.toString();
}