力扣算法-Day21

替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

对于输入字符串 "a5b",函数应该将其转换为 "anumberb"

输入:一个字符串 s,s 仅包含小写字母和数字字符。

输出:打印一个新的字符串,其中每个数字字符都被替换为了number

样例输入:a1b2c3

样例输出:anumberbnumbercnumber

数据范围:1 <= s.length < 10000。

思路:

很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

好处:不用申请新数组。

暴力解法:从前往后遍历,时间复杂度O(n^2);

双指针:right指向新长度的末尾,left指向旧长度的末尾。

从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
        时间复杂度:O(n);

暴力解法代码如下: 

#include
#include
int main() {
    char str[60001];
    scanf("%s",str);
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            int len = strlen(str);
            str[len+5] = '\0';
            for (int j = i; j < len; len--) {
                str[len+4] = str[len-1];
            }
            str[i++] = 'n';
            str[i++] = 'u';
            str[i++] = 'm';
            str[i++] = 'b';
            str[i++] = 'e';
            str[i] = 'r';
        }
    }
    printf("%s",str);
    return 0;
}

双指针:

#include
#include
int main() {
    char str[60001];
    scanf("%s",str);
    int count = 0;
    //计算数字个数;
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            count++;
        }
    }
    int len = strlen(str);
    int right = len + count*5;
    int left = len - 1;
    str[right--] = '\0';
    while (left >= 0) {
       if (str[left] >= '0' && str[left] <= '9') {
           str[right--] = 'r';
           str[right--] = 'e';
           str[right--] = 'b';
           str[right--] = 'm';
           str[right--] = 'u';
           str[right--] = 'n';
       } else {
           str[right--] = str[left];
       }
       left--;
    }
    printf("%s",str);
    return 0;
}

 这一期专栏记录将我每天的刷题,希望各位的监督,也希望和各位共勉。

追光的人,终会光芒万丈!!

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展)