每日一题AC

给定一个字符串s,先要对字符串第i个到第j个字符中查找是否存在字符ch,若存在,则删除其中第一个字符ch,若不存在,则在第j个字符后插入字符ch 输入说明: 第一行输入字符串s(长度len<1000)。 第二行输入正整数N和字符ch,N表示其后有N次操作(N<100)。 从第三行开始,其后N行每行有两个正整数i和j(1<=i<=j<=len) 输出说明: 输出N次操作之后的字符串 输入样例:

abcdefg
2 d
1 3
2 6

输出样例

abcdefg

样例说明:

abcdefg-->abcddefg-->abcdefg

代码AC

#include 
​
int length(char s[]) //计算数组长度
{
    int i = 0;
    while (s[i] != 0)
    {
        i++;
    }
    return i;
}
​
void insert(char s[], int j, char ch) //插入字符
{
    int len = length(s);
    for (int i = len; i > j; i--)
    {
        s[i] = s[i - 1];
    }
    s[j] = ch;
}
​
int main()
{
    char s[1000] = {0};
    scanf("%s", s);
    int n;
    char ch;
    scanf("%d%c", &n, &ch);
    for (int k = 0; k < n; k++)
    {
        int len;
        len = length(s);
        int i, j, flag = 0;
        scanf("%d%d", &i, &j);
        for (int x = i - 1; x < j; x++)
        {
            if (s[x] == ch)
            {
                for (int h = x; h < len; h++)
                {
                    s[h] = s[h + 1];
                }
                s[len - 1] = 0;
                flag = 1;
                break;
            }
        }
​
        if (flag == 0)
        {
            insert(s, j, ch);
        }
    }
    int i = 0;
    while (s[i] != 0)
    {
        printf("%c", s[i]);
        i++;
    }
    printf("\n");
    return 0;
}

优化

#include 
#include 
​
int main()
{
    char s[1000] = {0};
    scanf("%s", s);
    
    int n;
    char ch;
    scanf("%d %c", &n, &ch);
    
    int len = strlen(s);
    for (int k = 0; k < n; k++)
    {
        int i, j, flag = 0;
        scanf("%d %d", &i, &j);
        
        for (int x = i - 1; x < j; x++)
        {
            if (s[x] == ch)
            {
                memmove(&s[x], &s[x + 1], len - x - 1);
                len--;
                s[len]=0;
                flag = 1;
                break;
            }
        }
​
        if (flag == 0)
        {
            memmove(&s[j], &s[j - 1], len - j + 1);
            s[j - 1] = ch;
            len++;
        }
    }
    
    printf("%s\n", s);
​
    return 0;
}
​

涨知识:
memmove()`函数是C标准库中的内存拷贝函数,用于将内存块中的数据从一个地址移动到另一个地址。它可以处理源地址和目标地址重叠的情况,并且性能往往比`memcpy()`更优秀。
​
在优化后的代码中,`memmove(&s[x], &s[x + 1], len - x - 1)`这行代码的作用是将`s[x+1]`到`s[len-1]`的数据全部向前移动一格,并覆盖掉`s[x]`,相当于实现了删除`s[x]`的操作。其中,第一个参数`&s[x]`表示要移动的目标地址,第二个参数`&s[x+1]`表示要移动的源地址,第三个参数`len-x-1`表示要移动的字节数,即移动的范围。
​
在具体实现时,可以通过对数组`s[]`进行内存操作,来完成字符的插入和删除,同时可以减少循环次数,提高执行效率。

你可能感兴趣的:(C语言,算法,数据结构)