f*****2 发帖数: 141 | 1 这是一个大牛给的一个简单的O(n^2)的c代码,可我用eclipse运行时总有错误,如方
便的话,请帮我测试一下code,我想找到问题出自哪里,非常感谢。code如下:
void removeDuplicate(char s[])
{
int len = strlen(s);
if(len < 2) return;
int p = 0;
for(int i=0; i < len; ++i)
{
if(s[i] != '\0')
{
s[p++] = s[i];
for(int j=i+1; j < len; ++j)
if(s[j]==s[i])
s[j] = '\0';
}
}
s[p] = '\0';
} |
s********u 发帖数: 1109 | 2 首先,cc150新版没有这道题了。
其次,你代码都没贴全啊大哥。 |
f*****2 发帖数: 141 | 3 新版是第五版?只找到第四版的,code补全了,大侠帮忙看看吧
【在 s********u 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 首先,cc150新版没有这道题了。 : 其次,你代码都没贴全啊大哥。
|
s********u 发帖数: 1109 | 4 今天bbs有问题,刚刚写了一堆没有了,先贴代码:
void remove(char *str){
int left = 0, right = 0;
bool unique = true;
while(str[right]!= '\0'){
//你也可以用一个 bool unique(char *str,int right)函数来判断,不用这个
unique变量
unique = true;
for(int i = 0; i < right; i++){
if( str[i] == str[right] ){
duplicate = false;
break;
}
}
if(unique){
str[left++] = str[right++];
}else{
right++;
}
}
str[left] = '\0';
}
int main(){
char str[9] = "abcabxyx";
remove(str);
cout<
} |
s********u 发帖数: 1109 | 5 首先删除一个字符你为什么要用'\0'覆盖它呢,这个是字符串的结束符啊,比如"
abcabxyx"被你这么一弄,a变成'\0',字符串就变成abc了。
删除的话,首先想到的应该是把后面的平移上来把。
然后我更推荐对当前元素,往前看而不是往后看有没有重复的,这样的话,保证当前元
素之前的都是不重复的,并且总是操作当前元素,而不是后面随机的一个位置。
最后就是这种情况len其实是一直在变的,你的for循环i
while(str[i]!= '\0')来的容错率高,有必要的地方再i++ |
f*****2 发帖数: 141 | 6 用'\0'覆盖其实就是赋空值,其实这种思路是最简单,易理解的。如果是把后面的往前
移位,那还的判断这后面的一位和前面的所有
位还又没有重复的,其实更复杂。
这个解的妙处在于定义了一个flag:p,用abcabxyx这个例子,当第二个a被赋'\0'后,
第一层loop下标i往前走,然后如果这个新值
不是'\0',他的值就赋给p,也就是说在这步操作后字符串变成了abcx,而不是abc了,
然后当i结束后,再将有效字符串最后一位
赋'\0',这样字符串结束,新的字符串就是删除了所有重复的字符
当然你的方法也很好,我一试着写过,只是觉得这个方法更直观,容易理解,非常感谢
你和我一起讨论,学到了很多,多谢。 |