• 每日一题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次操作之后的字符串

    1. 输入样例:
    2. abcdefg
    3. 2 d
    4. 1 3
    5. 2 6
    6. 输出样例
    7. abcdefg
    8. 样例说明:
    9. abcdefg-->abcddefg-->abcdefg

     

    代码AC​

    1. #include
    2. int length(char s[]) //计算数组长度
    3. {
    4.    int i = 0;
    5.    while (s[i] != 0)
    6.   {
    7.        i++;
    8.   }
    9.    return i;
    10. }
    11. void insert(char s[], int j, char ch) //插入字符
    12. {
    13.    int len = length(s);
    14.    for (int i = len; i > j; i--)
    15.   {
    16.        s[i] = s[i - 1];
    17.   }
    18.    s[j] = ch;
    19. }
    20. int main()
    21. {
    22.    char s[1000] = {0};
    23.    scanf("%s", s);
    24.    int n;
    25.    char ch;
    26.    scanf("%d%c", &n, &ch);
    27.    for (int k = 0; k < n; k++)
    28.   {
    29.        int len;
    30.        len = length(s);
    31.        int i, j, flag = 0;
    32.        scanf("%d%d", &i, &j);
    33.        for (int x = i - 1; x < j; x++)
    34.       {
    35.            if (s[x] == ch)
    36.           {
    37.                for (int h = x; h < len; h++)
    38.               {
    39.                    s[h] = s[h + 1];
    40.               }
    41.                s[len - 1] = 0;
    42.                flag = 1;
    43.                break;
    44.           }
    45.       }
    46.        if (flag == 0)
    47.       {
    48.            insert(s, j, ch);
    49.       }
    50.   }
    51.    int i = 0;
    52.    while (s[i] != 0)
    53.   {
    54.        printf("%c", s[i]);
    55.        i++;
    56.   }
    57.    printf("\n");
    58.    return 0;
    59. }

    优化

    1. #include
    2. #include
    3. int main()
    4. {
    5.    char s[1000] = {0};
    6.    scanf("%s", s);
    7.    
    8.    int n;
    9.    char ch;
    10.    scanf("%d %c", &n, &ch);
    11.    
    12.    int len = strlen(s);
    13.    for (int k = 0; k < n; k++)
    14.   {
    15.        int i, j, flag = 0;
    16.        scanf("%d %d", &i, &j);
    17.        
    18.        for (int x = i - 1; x < j; x++)
    19.       {
    20.            if (s[x] == ch)
    21.           {
    22.                memmove(&s[x], &s[x + 1], len - x - 1);
    23.                len--;
    24.                s[len]=0;
    25.                flag = 1;
    26.                break;
    27.           }
    28.       }
    29.        if (flag == 0)
    30.       {
    31.            memmove(&s[j], &s[j - 1], len - j + 1);
    32.            s[j - 1] = ch;
    33.            len++;
    34.       }
    35.   }
    36.    
    37.    printf("%s\n", s);
    38.    return 0;
    39. }
    涨知识:
    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[]`进行内存操作,来完成字符的插入和删除,同时可以减少循环次数,提高执行效率。

     

  • 相关阅读:
    高项 干系人管理论文
    记一次BootCDN被黑产挂马导致站点跳转博彩网站的问题
    云IDE产品评测感受
    在Win11上部署ChatGLM2-6B详细步骤--(上)准备工作
    selenium爬虫如何绕过反爬,看这一篇文章就足够了
    (windows10)设置环境变量简化EVOSUITE的运行
    Netty入门——ByteBuf
    AST使用eval运行函数,更换数值
    机器学习中的 K-均值聚类算法及其优缺点。
    线上应用故障排查之一:高CPU占用
  • 原文地址:https://blog.csdn.net/weixin_74384251/article/details/133715273