前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-482-License Key Formatting

leetcode-482-License Key Formatting

作者头像
chenjx85
发布2018-07-05 16:17:39
4460
发布2018-07-05 16:17:39
举报

题目描述:

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.

Example 1:

代码语言:javascript
复制
Input: S = "5F3Z-2e-9-w", K = 4

Output: "5F3Z-2E9W"

Explanation: The string S has been split into two parts, each part has 4 characters.
Note that the two extra dashes are not needed and can be removed.

Example 2:

代码语言:javascript
复制
Input: S = "2-5g-3-J", K = 2

Output: "2-5G-3J"

Explanation: The string S has been split into three parts, each part has 2 characters except the first part as it could be shorter as mentioned above.

Note:

  1. The length of string S will not exceed 12,000, and K is a positive integer.
  2. String S consists only of alphanumerical characters (a-z and/or A-Z and/or 0-9) and dashes(-).
  3. String S is non-empty.

要完成的函数:

string licenseKeyFormatting(string S, int K) 

说明:

1、给定一个字符串S和一个正数K,字符串中只含有字母、数字和破折号,比如5F3Z-2e-9-w。

要求将字符串的格式重新编排,使得被破折号隔开的每个部分含有K个字符,除了最开始的第一个部分可以是小于等于K个字符的,但必须至少有一个字符。

同时要求字符串中的小写字母转化为大写字母。

比如字符串是5F3Z-2e-9-w,K=4,那么重新编排完格式是5F3Z-2E9W。

如果字符串是9-5F3Z-2e-9-w,K=4,那么重新编排完格式就是9-5F3Z-2E9W。

2、题意清晰,这道题我们要从字符串的最后开始处理,这样比较方便。

代码如下:(附详解)

代码语言:javascript
复制
    string licenseKeyFormatting(string S, int K) 
    {
        string res;//最后要返回的字符串
        int i=S.size()-1,count=0;
        while(i>=0)
        {
            if(S[i]!='-')//如果这个字符是字母或者数字
            {
                count++;
                if(count<=K)//如果还没有达到K个
                {
                    res+=char(toupper(S[i]));//大小写转换,增加到res中
                    i--;
                }
                else//如果达到了K个
                {
                    res+='-';//插入'-'
                    count=0;//重新开始计数
                }
            }
            else//如果这个字符是'-'
                i--;
        }
        reverse(res.begin(),res.end());//最后反转一下,就是我们要的字符串。
        return res;
    }

上述代码实测12ms,beats 98.58% of cpp submissions。

3、一些其他说明:

可能有的同学写的也是跟笔者一样的2中的代码,只不过在res+=char(toupper(S[i]))这里,改成了res=char(toupper(S[i]))+res。这样最后就不用reverse了。

但这样提交了之后会发现花费时间巨大,是2中代码花费时间的20倍左右。

原因是res=char(toupper(S[i]))+res处理的时候,可以看做是重新定义一个临时字符串,把S[I]的值放进去,然后再增加了res,最后把临时字符串赋给了res。

而res+=char(toupper(S[i]))是直接在res后面增加了S[i],类似于vector.push_back()。

两者相比较起来,还是2中的方法快速,最后做一下reverse其实花费时间也不多。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档