zoukankan      html  css  js  c++  java
  • leetcode-482-License Key Formatting

    题目描述:

    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:

    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:

    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、题意清晰,这道题我们要从字符串的最后开始处理,这样比较方便。

    代码如下:(附详解)

        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其实花费时间也不多。

  • 相关阅读:
    [如何构建自己的轮式移动机器人系统·从入门到放弃]机器人底层篇
    Readme.txt
    [MATLAB&SIMULINK] 如何提取并处理Simscape Power System 中powergui的谐波分析数据
    记录2016年12月11日
    [深度强化学习] blog翻译使用Keras与Gym仿真环境进行深度Q学习(DQL)
    使用PARL与Gym仿真环境进行深度Q学习(DQL)
    Telerik控件使用Expression_DarkTheme后引发Combobx下拉问题
    [Win系统][临时方案]系统任务管理器不能使用临时性解决方案
    [Visual Studio]重置开发环境
    WPF中使用DataGrid后,里面的Button的Command不响应的问题
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9159194.html
Copyright © 2011-2022 走看看