56 lines
1.8 KiB
JavaScript
56 lines
1.8 KiB
JavaScript
|
function successor(str) {
|
||
|
var alphabet = 'abcdefghijklmnopqrstuvwxyz',
|
||
|
length = alphabet.length,
|
||
|
result = str,
|
||
|
i = str.length;
|
||
|
|
||
|
while(i >= 0) {
|
||
|
var last = str.charAt(--i),
|
||
|
next = '',
|
||
|
carry = false;
|
||
|
|
||
|
if (isNaN(last)) {
|
||
|
index = alphabet.indexOf(last.toLowerCase());
|
||
|
|
||
|
if (index === -1) {
|
||
|
next = last;
|
||
|
carry = true;
|
||
|
}
|
||
|
else {
|
||
|
var isUpperCase = last === last.toUpperCase();
|
||
|
next = alphabet.charAt((index + 1) % length);
|
||
|
if (isUpperCase) {
|
||
|
next = next.toUpperCase();
|
||
|
}
|
||
|
|
||
|
carry = index + 1 >= length;
|
||
|
if (carry && i === 0) {
|
||
|
var added = isUpperCase ? 'A' : 'a';
|
||
|
result = added + next + result.slice(1);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
next = +last + 1;
|
||
|
if(next > 9) {
|
||
|
next = 0;
|
||
|
carry = true;
|
||
|
}
|
||
|
|
||
|
if (carry && i === 0) {
|
||
|
result = '1' + next + result.slice(1);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
result = result.slice(0, i) + next + result.slice(i + 1);
|
||
|
if (!carry) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
console.log(successor('abcd'));
|
||
|
console.log(successor('3456'));
|