题目地址:
https://leetcode.com/problems/smallest-string-with-a-given-numeric-value/
给定一个正整数 n n n与一个不小于 n n n的正整数 k k k,同时为每个字母规定一个分数, a a a是 1 1 1分,以后以此类推。要求返回一个长 n n n的只含英文小写字母的字符串,其总分恰好是 k k k,并且其字典序是最小的。题目保证有解。
思路是,开一个长 n n n的字符数组,然后先将 a a a填进去,看 k k k被用掉多少分,然后从最低位向前,尽量用掉 k k k分,用完为止。代码如下:
import java.util.Arrays;
public class Solution {
public String getSmallestString(int n, int k) {
char[] chs = new char[n];
// 先把'a'全填上,然后后面再把k值用完
Arrays.fill(chs, 'a');
// k值用掉n
k -= n;
for (int i = chs.length - 1; i >= 0; i--) {
// 用完了,直接退出
if (k <= 0) {
break;
}
if (k >= 'z' - chs[i]) {
k -= 'z' - chs[i];
chs[i] = 'z';
} else {
chs[i] += k;
k = 0;
}
}
return new String(chs);
}
}
时空复杂度 O ( n ) O(n) O(n)。