LeetCode 1663. 具有给定数值的最小字符串(贪心)

题目

思路

 这道题要求答案的字典序最小,一个朴素的想法是前面尽量填a,那么那么前面究竟最多可以填入几个a呢?答案是保证在填了a以后,空余的位全部填z加和之后仍然能满足题目要求。所以可以通过循环找到对应位置,这里我是用数学表达式取代了循环。找到要填多少个a以后用k减掉相当数量的a,剩下的数如果小于等于26,则填入对应代表的字母即可。否则在字符串末尾尽量填z,最后剩下的数再用对应的字符填充。

代码:

class Solution:
    def getSmallestString(self, n: int, k: int) -> str:
        temp=0
        ans=''
        if k==n:
            for i in range(n):
                ans=ans+'a'
            return ans
        elif k==26*n:
            for i in range(n):
                ans=ans+'z'
            return ans
        # for i in range(1,n+1):
        #     if 26*(n-i)<=k-i:
        #         temp=i-1
        #         break
        temp=(26*n-k)//25   #这里是通过上述循环得到的表达式
        print(temp)
        for i in range(temp):
            ans=ans+'a'
        k-=temp
        if k<=26:           #如果剩下的数小于等于26,则再添加一个即可
            ans=ans+chr(k-1+ord('a'))
            return ans
        cur=k//26
        now=k%26
        if now:
            ans=ans+chr(now-1+ord('a'))
        for i in range(cur):
            ans=ans+'z'
        return ans

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值