刷题的日常-具有给定数值的最小字符串

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

下雨了,没法出门

刷题的日常-2023年2月5号

一天一题,保持脑子清爽

具有给定数值的最小字符串

来自leetcode的 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] 靠前。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个长度,代表需要构造的字符串的长度
  • 另外给出一个数值,代表需要返回的字符串中字母的和,规则如题意所示
  • 要求我们生成的字符串的字典序最小

做题思路

要求字典序最小,那么生成的字符串应该符合大的在后,小的往前靠。直观上就可以知道的一个道理,这道题符合贪心,直接就用贪心做。
因为字符最小的是 a,那么我们就需要将 a 字符填进结果中,然后从后往前扫描,如果大于25,则说明超过了英文字符可以表示的范围,这个时候就需要将当前字符置为 z,否则就可以加上余下的值,然后返回即可。

代码实现

代码实现如下:

public class Solution {
    public String getSmallestString(int n, int k) {
        char[] res = new char[n];
        Arrays.fill(res, 'a');
        k -= n;
        int idx = n - 1;
        while (k > 0) {
            if (k > 25) {
                k -= 25;
                res[idx--] += 25;
                continue;
            }
            res[idx] += k;
            break;
        }
        return new String(res);
    }
}