问题描述
给定一个许可密钥字符串 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;
}