public static String getSmallestString(int n, int k) {
/**
* 此处分析 为何使用布尔变量is
* 当遇到案例 24 552时
* 经第一次for循环,得到count为 20 即20个z,k为9+23=32,n=4
* 此时叠加20个z,但是下次循环 k为32 还能追加一个z,所以 控制变量i 还是从26开始遍历。(即当进入嵌套for循环时 才令is为true)
* 后续i++
*/
StringBuffer sb = new StringBuffer();
boolean is = false;
while (n > 0){//到达一定字母数量,出循环
for (int i = 26; i > 0; i--) {//循环遍历从26(z)到1(a)
is = false;
int count = (k-(n-1))/i;//预留出前n-1个位置 后面字母尽量取最大值,能取count个
k-=count*i;//k减去 count*i
n-=count; // 还需多少个字母
for (int j = 0; j < count; j++) {//出现了count个 i 字母的 叠加
Character c = (char)('a'+i-1);
sb.append(c);
is = true;
}
if(is)i++;
if(k==0 || n==0)break;
}
}
return sb.reverse().toString();
}