我想编写一个代码,用于删除字符串中的给定字符。我想出了以下代码片段。
现在,虽然这是我的工作,它给我一个O(n ^ 2)的最坏情况复杂性。任何人都可以帮助我改进这一点。
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void Push(char *, int i);
int n=6;
int main()
{
clrscr();
char *p = "helelo";
char delChar = 'e';
for(int i=0;i<5;i++)
{
if(*(p + i) == delChar)
{
Push(p, i);
}
}
cout<<p<<endl;
getch();
return 1;
}
void Push(char *p, int i)
{
for(int k=i;k<n;k++)
{
*(p + k) = *(p+k+1);
}
}
由于
答案 0 :(得分:4)
#include <cstring>
#include <algorithm>
#include <iostream>
int main() {
using namespace std;
char s[] = "helelo";
cout << s << '\n';
char *end = s + strlen(s);
end = remove(s, end, 'e');
*end = '\0';
cout << s << '\n'; // hllo
return 0;
}
请注意,您无法修改字符串文字,因此我使用了char数组。 std :: string会更容易。
如果你想了解std :: remove是如何工作的,那么char * instantiation(因为它是一个模板)会保持简单,如下所示:
char* remove(char *begin, char *end, char value) {
char *next = begin;
for (; begin != end; ++begin) {
if (*begin != value) {
*next++ = *begin;
}
}
return next;
}
答案 1 :(得分:0)
一个想法是使用有效字符(不同于不需要的字符)从第一个字符串构造一个新字符串,然后用构造的字符串初始化第一个字符串。
答案 2 :(得分:0)
这样的事情应该这样做:
char *p = "helelo";
char delChar = 'e';
int len = strlen(p);
for(int j=0, int i=0;i<len;i++)
{
if(*(p + i) != delChar)
{
*(p+j)=*(p+i);
++j;
}
}
*(p+j)='\0';
cout<<p<<endl;
getch();
return 1;
答案 3 :(得分:0)
怎么样:
int main() {
clrscr();
char *p = "helelo";
char delChar = 'e';
int k=0;
for( int i=0; *(p+i); i++ ) {
if(*(p + i) != delChar) {
*(p + k++) = *(p + i);
}
}
*(p + k) = '\0';
cout<<p<<endl;
getch();
return 1;
}