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

贴原题:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值