1,题目要求
You are given a license key represented as a string S which consists only alphanumeric character and dashes. The string is separated into N+1 groups by N dashes.
Given a number K, we would want to reformat the strings such that each group contains exactly K characters, except for the first group which could be shorter than K, but still must contain at least one character. Furthermore, there must be a dash inserted between two groups and all lowercase letters should be converted to uppercase.
Given a non-empty string S and a number K, format the string according to the rules described above.
将一个用’-‘分割的字符串划分为给定组长度的字符串,其中,第一个块的长度可以不是给定长度。
字符串由数字和字母组成,要求输出的字符串全部由大写字母组成。
2,题目思路
首先,字符大小写转换可以用自带的函数来实现,也可以用ASCII的方式来实现(大写字母比小写字母的ASCII值小了32)。
普通的办法,就是先对字符串进行遍历,然后去掉”-“后,根据给定的K值来对”-“进行重新安排。
需要注意的是,因为第一个块没有长度限制,如果对其进行单独处理,虽然也可以做到,但是比较繁琐。
简便的办法就是从后往前进行字符串的遍历和处理。
3,程序源码
class Solution {
public:
string licenseKeyFormatting(string S, int K) {
string res = "";
for(auto a = S.rbegin();a<S.rend();a++)
{
if(*a !='-')
{
if(res.size()%(K+1) == K)
res += "-";
res += toupper(*a);
}
}
reverse(res.begin(), res.end());
return res;
}
};
rbegin() 和 rend()迭代器是一个指针,因此在调用时需要按照指针的方式进行使用。
作用是从后往前进行迭代。
if(res.size()%(K+1) == K)
关于这一点,首先,因为如果给定的值为K(假如为2),那么每两个字符中间就要插入一个”-“,因此在求余时,就要mod K+1而不是K。
其次,之所以是 == K 而不是 ==0,是由于如果 ==0,会使得res的长度为0(初始),也会加入一个’-‘,也就是会在开头(实质上是尾部)加入一个错误’-‘,因此需要 ==K来解决这一问题。