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;
}
};
在这里插入代码片
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片