字符串替换

本文介绍两种字符串空格替换算法及其实现,并提供一种有序数组合并的方法。第一种算法通过双指针技巧实现高效替换,时间复杂度为O(n);第二种算法采用简单直接的遍历替换方式,时间复杂度为O(n^2)。此外,还讨论了一个有序数组合并的问题,通过双指针从后向前比较的方式实现两个有序数组的合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
请实现一个函数,把字符串的每个空格替换成“%20”。
例如:
输入”We are Happy.”则输出”We%20are%20happy.”

算法描述1:
1)利用循环,计算字符串长度(‘\0’也算),空格个数
2)更改后字符串的长度为:原长度+2*空格个数
将一根指针放到更改后字符串末尾的位置,另一根指针放到没有更改的字符串的末尾,
进行复制.
时间复杂度:(O(n))

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Str_Change_Space(char str[])
{
    int  length, count,length2;
    for (count = 0, length = 0; str[length]; length++)
    {
        if (str[length] == ' ')
        {
            count++;    
        }

    }
    length++;//加上'\0'
    length2 = length+ 2 * count;
    while (length2-length)
    {
        if (str[length] - ' ')
        {
            str[length2--] = str[length];
        }
        else
        {
            str[length2--] = '0';
            str[length2--] = '2';
            str[length2--] = '%';
        }   
        length--;
    }
}
int main(void)
{
    char str[30] = "We are Happy.";
    Str_Change_Space(str);
    puts(str);
    system("pause");
    return 0;
}

算法描述2:
从前到后依次遍历,遇到空格,后面的元素向后面移动2个单位
之后再将%20插入到空格处
时间复杂度(O(n^2))

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Insert_Symbol(char str[])
{
    int i, j;
    for (i = 0; str[i];)
    {
        if (str[i]==' ')//如果遇到空格,后面元素向后移动2个单位
        {
            for (j = strlen(str); j-i; j--)
            {
                str[j + 2] = str[j];
            }
            //在空格位置插入%20
            str[i++] = '%';
            str[i++] = '2';
            str[i++] = '0';
        }
        else
        {
            i++;
        }
    }
}
int main(void)
{
    char str[30] = " hello world ";
    Insert_Symbol(str);
    puts(str);
    system("pause");
    return 0;
}

举一反三:
有两个有序数组,A1和A2,内存在A1的末尾有足够的空间容纳A2
请实现一个函数,把A2中的所有数字插入A1中,并且所有数字是有序的。
算法描述:
1)先统计A1,A2的长度L1,L2,哪么合并后长度为A1,A2长度之和即L1+L2,
2)将两根指针分别放到L1,L2处,比较a[L1-1]和a[L2-1]的大小,
将较大的放大到A1[L1+L2-1]的位置,
较大的元素所在数组长度减1
直到L1或者L2中有一个数组长度为零
结束循环,将剩下的数组复制到A1中。

#include<stdio.h>
#include<stdlib.h>
void Combine(int a[], int n, int b[], int m)
{
    int length1, length2;
    if (!a || n <= 0 || !b || m <= 0)
    {
        return;
    }
    length1 = n;
    length2 = m;
    while (length1  && length2 )
    {
        if (a[length1 - 1] > b[length2 - 1])
        {
            a[length1 + length2 - 1] = a[length1 - 1];
            printf("a,a[%d]=%5d\n", length1 + length2 - 1, a[length1 + length2 - 1]);
            length1--;
        }
        else
        {

            a[length1 + length2 - 1] = b[length2-1 ];
                printf("b,a[%d]=%5d\n", length1 + length2 - 1,a[length1 + length2 - 1]);
            length2--;
        }
    }
    if (length2)//如果b数组没有处理完,将剩余部分全部复制到a数组中
    {
        for (; length1 < length2; length1++)
        {
            a[length1] = b[length1];
        }
    }
}
int main(void)
{
    int a[100] = { 1,2,3,4,5,6,7 };
    int b[10] = { 2,3,4,5,6,7 };
    Combine(a, 7, b, 6);
    for (int i = 0; a[i]; i++)
    {
        printf("%5d",a[i]);
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值