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

 

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();
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值