不积跬步无以至千里

不积小流无以成江海

482. License Key Formatting

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来解决这一问题。

阅读更多
版权声明:仅供参考与学习交流 https://blog.csdn.net/lym940928/article/details/79973623
上一篇263. Ugly Number
下一篇819. Most Common Word
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭