LeetCode 482. 密钥格式化 | C++语言版

LeetCode 482. 密钥格式化

题目描述

题目地址482. 密钥格式化
给定一个许可密钥字符串 s,仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。

我们想要重新格式化字符串 s,使每一组包含 k 个字符,除了第一组,它可以比 k 短,但仍然必须包含至少一个字符。此外,两组之间必须插入破折号,并且应该将所有小写字母转换为大写字母。

返回 重新格式化的许可密钥 。
在这里插入图片描述

解题思路

思路一:使用栈
代码实现

C++

class Solution {
public:
    string licenseKeyFormatting(string s, int k) {
        //输入:S = "5F3Z-2e-9-w", k = 4  输出:"5F3Z-2E9W"

        //1.先提取秘钥
        string key;
        //遍历秘钥字符串S,将破折号全部删去
        for(char c:s){
            if(c!='-'){
                //将非破折号的字符存入密钥新字符串key中
                key+=c;
            }
        }

        //2.小写字母转化为大写字母(注意这里遍历时要加&符号,表示引用,可以直接修改,若不加则没有修改)
        for(char &c:key){
            if(c<='z' && c>='a'){
                //将小写字母变换成大写字母
                //首先c-'a'计算出此小写字母的偏移;如c=‘b’;则其偏移就为‘b’-‘a’=1;一个大字母在小写字母的偏移号+大写字母的基值('A'); 即可得到对应的小写值1+‘A’=‘B’;
                c=c-'a'+'A';        
            }
        }

        //3.按照新的分组规则对密钥进行分组
        //结果字符串
        string ret;
        int n=key.size();
        //分组数
        int group=n/k;
        
        //若n能被k整除
        if(n%k==0){
            //恰好可以分为n/k组,每组恰好有k个字符
            for(int i=0;i<group;i++){
                //第i组字符为[i*k,(i+1)*k]
                //字符截取函数 substr():第一个参数代表开始位置,第二个参数代表截取的长度
                ret+=key.substr(i*k,k);
                //除最后一组外,均加上破折号
                if(i<group-1) ret+='-';

            }
        }else{
            //若n不能被k整除,说明可以分为(n/k)+1组。第一组有n%k个字符,其余组均有k个字符
            ret+=key.substr(0,n%k);
            if(group>0){
                ret+='-';
                for(int i=0;i<group;++i){
                    //第一组,它可以比k短,但仍然必须包含至少一个字符(n%k)
                    ret+=key.substr(i*k+n%k,k);
                    //除最后一组外,均加上破折号
                    if(i<group-1) ret+='-';
                }
            }
        }
        return ret;

    }
};
在这里插入代码片
运行结果

在这里插入图片描述

参考文章:

https://leetcode.cn/problems/license-key-formatting/solutions/1030021/suan-fa-xiao-ai-guo-qing-40jiang-bu-ming-23si/

思路二:减少遍历节点数
代码实现
在这里插入代码片
运行结果
参考文章:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李莲花*

多谢多谢,来自一名大学生的感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值