leetcode 482. License Key Formatting(C语言,标准化密钥)25

来源:互联网 发布:d3.js v4画力导向图 编辑:程序博客网 时间:2024/05/21 08:42

贴原题:

Now you are given a string S, which represents a software license key which we would like to format. The string S is composed ofalphanumerical characters and dashes. The dashes split the alphanumerical characters within the string into groups. (i.e. if there are M dashes, the string is split into M+1 groups). The dashes in the given string are possibly misplaced.

We want each group of characters to be of length K (except for possibly the first group, which could be shorter, but still must contain at least one character). To satisfy this requirement, we will reinsert dashes. Additionally, all the lower case letters in the string must be converted to upper case.

So, you are given a non-empty string S, representing a license key to format, and an integer K. And you need to return the license key formatted according to the description above.

Example 1:
Input: S = “2-4A0r7-4k”, K = 4
Output: “24A0-R74K”

Explanation: The string S has been split into two parts, each part has 4 characters.

Example 2:
Input: S = “2-4A0r7-4k”, K = 3
Output: “24-A0R-74K”

Explanation: The string S has been split into three parts, each part has 3 characters except the first part as it could be shorter as said above. Note: The length of string S will not exceed 12,000, and K is a positive integer. String S consists only of alphanumerical characters (a-z and/or A-Z and/or 0-9) and dashes(-). String S is non-empty.

解析:
  本题是给出一个由连接符(即减号-)、数字和大小写字母组成的字符串,以及一个数K。要求我们以K个元素为一组,每一组之间以连接线做分割,除了第一组可能更短,但仍然必须包含至少一个字符。此外还需要把小写字母转化成大写字母。
  我的思路是先计算字符串中除去连接符以外的元素个数,再由这个长度和给出的K计算出第一组的长度,把第一组单独处理,剩下的就很简单了——每隔K个非‘-’字符为一组,每一组间添加一个‘-’。具体看下面程序——

贴C代码:

char* licenseKeyFormatting(char* S, int K) {    int prilen=strlen(S);//所给的字符串长度    int len=0;//除去连接字符串的长度    for(int i=0; i<prilen; i++)    {        if(*(S+i)!='-')        {            len++;        }    }    int relen=2*len;//返回数组长度,要足够大,或者可以在下面realloc    char *ch=(char *)malloc(relen*sizeof(char));//返回数组    int firlen=len%K;//第一个连接线前的字符个数    int j=0;//返回数组的下标计数器    int i=0;//原数组下标计数器    int y=0;//非-字符个数计数器    for(; j<firlen; i++)//第一个连接线前的字符前的单独处理    {        if(*(S+i)!='-')        {            if(*(S+i)>='a' && *(S+i)<='z')            {                *(ch+j)=*(S+i)-32;            }            else            {                *(ch+j)=*(S+i);            }            j++;            y++;        }    }    if(j && y<len)    {        *(ch+j)='-';        j++;    }    int x=0;//计数器    for(; i<prilen; i++)    {        if(*(S+i)!='-')        {            if(*(S+i)>='a' && *(S+i)<='z')//小写字母转大写            {                *(ch+j)=*(S+i)-32;            }            else            {                *(ch+j)=*(S+i);            }            j++;            x++;            y++;        }        if(x>=K && y<len)//连接符        {            x=0;            *(ch+j)='-';            j++;        }    }    *(ch+j)='\0';    return ch;}
原创粉丝点击