【Leetcode】1663. Smallest String With A Given Numeric Value

题目地址:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值