问题描述
给定一个许可密钥字符串 s,仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。
我们想要重新格式化字符串 s,使每一组包含 k 个字符,除了第一组,它可以比 k 短,但仍然必须包含至少一个字符。此外,两组之间必须插入破折号,并且应该将所有小写字母转换为大写字母。
返回 重新格式化的许可密钥 。
根据问题描述
我们需要删除原字符串中的所有’-‘,然后根据新得到的字符串从末尾向前进行划分,每个k个字符重新添加’-‘,根据这种规则我们可以很方便的得到代码,但是需要注意特殊情况——原字符串去掉’-'之后得到的是空串,这种情况直接返回空串就行。
代码
char* licenseKeyFormatting(char* s, int k) {
int length=0;
for(;s[length]!='\0'; length++);
int s_length = length;
for(int i=0; s[i]!='\0'; i++){
if(s[i]=='-'){
length--;
}else if(s[i]>='a'&&s[i]<='z'){
s[i] = s[i] - 'a' + 'A';
}
}
char *answer = NULL;
if(length>0){
int nums_group = length/k+(length%k+k-1)/k-1;
answer = (char *)malloc(sizeof(char)*(length+nums_group+1));
answer[length+nums_group] = '\0';
int count = 0;
int index = length+nums_group-1;
for(int i=s_length-1; i>=0; i--){
if(s[i]!='-'){
answer[index--] = s[i];
count++;
if(count==k&&index>=0){
count = 0;
answer[index--] = '-';
}
}
}
}else{
answer = (char *)malloc(sizeof(char));
answer[0] = '\0';
}
return answer;
}