给定一个字符串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[]`进行内存操作,来完成字符的插入和删除,同时可以减少循环次数,提高执行效率。