力扣(LeetCode)1694. 重新格式化电话号码(C语言)

一、环境说明

  1. 本文是 LeetCode 1694题 : 重新格式化电话号码,使用c语言实现。
  2. 模拟。
  3. 测试环境:Visual Studio 2019。

二、代码展示

void swap(char* a, char* b) {
    char temp = *a;
    *a = *b, * b = temp;
}
char* reformatNumber(char* number) {
    int cur = 0, i = 0;//cur指向待交换的位置,i指向遍历的位置
    while (number) {//遍历number
        while (number[i]&&number[i] >= '0' && number[i] <= '9') {//当前位置是数字
            swap(number + cur, number + i);//把所有数字提前
            cur++;//存数字的位置往后一位
            i++;//看下一个位置
        }
        if (0 == number[i]) {
            break;
        }
        i++;//看下一个位置
    }
    number[cur] = 0;//数字后,补一个结束符。
    int len = strlen(number);//数字个数
    //3种情况
    //1==len%3,if(4==len) 需要len/3 个 '-'
    //2==len%3 if(2==len) 需要len/3 个 '-'
    //0==len%3 需要len/3 - 1 个'-'
    int extra = (len - 1) / 3;//需要'-'的数量//这一行包含上面三种情况
    cur = 0;//cur指向number
    i = 0;//i指向ans
    char* ans = (char*)calloc(extra + len + 1, sizeof(char));
    while (len) {//看情况增加'-'
        if (len - cur > 4) {
            strncpy(ans + i, number + cur, 3 * sizeof(char));//有库函数,简单轮子拿来用
            i += 3, cur += 3;
            ans[i++] = '-';//补一个'-'
        }
        else {//len-cur<=4
            if (1 == len % 3) {//len-cur=4
                strncpy(ans + i, number + cur, 2 * sizeof(char));
                i += 2;
                ans[i++] = '-';
                strncpy(ans + i, number + cur + 2, 2 * sizeof(char));
                i += 2;
            }
            else if(2==len %3){//len-cur=2
                strncpy(ans + i, number + cur, 2 * sizeof(char));
                i += 2;
            }
            else {//len - cur = 3
                strncpy(ans + i, number + cur, 3 * sizeof(char));
                i += 3;
            }
            break;
        }
    }
    return ans;
}

三、思路分析

  • 重新格式化电话号码,主要考察字符串操作,内存空间的认知。
  • 写一个 s w a p swap swap函数,一次遍历 n u m b e r number number,把所有数字放在 n u m b e r number number最前面。
  • 申请堆空间 a n s ans ans,用于保存答案。
  • 再次遍历 n u m b e r number number,将数字格式化,并保存在 a n s ans ans中。

四、代码分析

  • 理解思路很重要!
  • 细节看注释嗷。
  • 博主欢迎读者在评论区留言,作为日更博主,看到就会回复的。

五、AC

AC

六、复杂度分析

  1. 时间复杂度: O ( n ) O(n) O(n) , n u m b e r number number数组的大小= n n n。两次遍历 n u m b e r number number的时间复杂度是 O ( 2 n ) O(2n) O(2n),即 O ( n ) O(n) O(n)
  2. 空间复杂度: O ( n ) O(n) O(n),申请了用于保存答案的 a n s ans ans,大小为 n + e x t r a + 1 n+extra+1 n+extra+1 e x t r a extra extra是格式化需要加入 ′ − ′ '-' 的数量, a n s ans ans的空间复杂度是 O ( n ) O(n) O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值