当前位置:网站首页>LeetCode·每日一题·1417.重新格式化字符串·模拟

LeetCode·每日一题·1417.重新格式化字符串·模拟

2022-08-11 10:26:00 小迅想变强

链接:https://leetcode.cn/problems/reformat-the-string/solution/by-xun-ge-v-aazm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目

 

示例

 

思路

解题思路
根据题意,我们需要重新构造一个字符串,该字符串必须字母后面应该跟着数字,而数字后面应该跟着字母。
所以只有当字符串中 字符个数 和 数字个数 相差小于 1 时,才能构造

通过简单模拟构造不能想到,当字符或者数字任意一个较多时,我们必须从多的那个开始构造字符串,因为多一个所以必须开始放一个结束放一下才满足要求

构造过程使用双指针更加方便

代码注释超级详细

代码

char * reformat(char * s){
    int len = strlen(s);//求字符串长度
    int sum = 0;
    for(int i = 0; i < len; i++)//遍历字符串求数字长度
    {
        char ch = s[i];
        if (isdigit(ch)) {//判断字符是否为数字函数
            sum++;
        }
    }
    int summ = len - sum;
    if(abs(summ - sum) > 1)//判断差值
    {
        return "";
    }
    int logo = summ > sum ? 1 : 0;
    for(int i = 0, j = 0; i < len; i++)
    {
        if(logo == 1)//字母多,字母先构造
        {
            if(!isdigit(s[j]) && j == 0)//开头就是字母,不需要额外处理
            {
                j++;
                continue;
            }
        }
        else//数字多,数字先构造
        {
            if(isdigit(s[j]) && j == 0)//开头就是数字,不需要额外处理
            {
                j++;
                continue;
            }
        }
        //如果开头不满足要求,其实就和平常构造过程一样。
        //当双指针指向的元素相同时,慢指针留在当前位置,快指针去找不同元素与其交换
        if( (isdigit(s[j]) && isdigit(s[i])) || (!isdigit(s[j]) && !isdigit(s[i])) )
        {
            continue;
        }
        char ch = s[i];
        s[i] = s[j];
        s[j] = ch;
        j += 2;
    }
    return s;
}

作者:xun-ge-v
链接:https://leetcode.cn/problems/reformat-the-string/solution/by-xun-ge-v-aazm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原网站

版权声明
本文为[小迅想变强]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_64560763/article/details/126280051