1663. 具有给定数值的最小字符串
大约 2 分钟
1663. 具有给定数值的最小字符串
题目描述
小写字符 的 数值 是它在字母表中的位置(从 1
开始),因此 a
的数值为 1
,b
的数值为 2
,c
的数值为 3
,以此类推。
字符串由若干小写字符组成,字符串的数值 为各字符的数值之和。例如,字符串 "abe"
的数值等于 1 + 2 + 5 = 8
。
给你两个整数 n
和 k
。返回 长度 等于 n
且 数值 等于 k
的 字典序最小 的字符串。
注意,如果字符串 x
在字典排序中位于 y
之前,就认为 x
字典序比 y
小,有以下两种情况:
x
是y
的一个前缀;- 如果
i
是x[i] != y[i]
的第一个位置,且x[i]
在字母表中的位置比y[i]
靠前。
示例 1:
输入:n = 3, k = 27
输出:"aay"
解释:字符串的数值为 1 + 1 + 25 = 27,它是数值满足要求且长度等于 3 字典序最小的字符串。
示例 2:
输入:n = 5, k = 73
输出:"aaszz"
提示:
1 <= n <= 105
n <= k <= 26 * n
思路
根据题目的输入n和k,第一想法是尽可能的先放置a字母,最后放置z字母,这是一个典型的贪心思想。
所以我们可以从贪心的角度进行解决该问题。
先new一个n长度的char数组,初始化为全部的a,然后我们从数组的最后一位下标开始更新答案,将k减去n,表示已经放置的a的数量。
当k大于25时,我们更新idx位置的字母a为字母z,同时更新idx为idx-1,继续更新下一个需要更新的字母。
当k小于25时,我们只需要将第idx位的字母更新为a+k的大小即可。\
解法
class Solution {
//26-z
public String getSmallestString(int n, int k) {
char[] ss=new char[n];
for(int i=0;i<n;i++){
ss[i]='a';
}
k=k-n;
int idx=n-1;
while(k>25){
ss[idx]='z';
k=k-25;
idx--;
}
if(k>0){
ss[idx]=(char)(ss[idx]+k);
}
String res=new String(ss);
return res;
}
}