面试题——字符串类型001

来源:互联网 发布:美食电视或者综艺 知乎 编辑:程序博客网 时间:2024/06/08 08:48
#include <stdio.h>
 
void remove_repeat(char *s,int iLen){
for(int i=0;s[i];i++){
for(int j=i+1;s[j];){
if(s[i]==s[j]){
for(int m=j;s[m];m++){
s[m]=s[m+1];//②s[m]=[++m]这种写法是有问题的,因为不知道++m是先执行还是后执行
}
}else{
j++;//①当相等的时候 j不用++
}
}
}
}
 
 
int main(){
char s[10]={'a','s','f','a','s','f','a','s','f'};//③数组大小把'\0'计算在内
//char s[5]="abaa";
remove_repeat(s,9);
printf("%s\n",s);
return 0;
}
题目:
Design an algorithm and write code to remove the duplicate characters in a string 
without using any additional buffer NOTE: One or two additional variables are fine 
An extra copy of the array is not。

意思是:设计一个算法编码实现删除一个字符串中重复的字符。不允许使用额外的空间:
一两个额外的变量是允许的,但是数组的拷贝是不允许的。

思路一:
最常规的想法是,第一个,第二个,第三个。。依次和它们后面的进行比较。如果有重复,则把后面的元素向前移动,覆盖那个重复的元素。
代码如上所示:
我犯的错误:
1、函数返回空,放到打印函数内VS会警告
比如:
printf("%s\n",func());
2、不能以<=iLen为结束条件:因为当abaa的情况时,最后会出现i指向的为'\0'而j指向的也为
'\0',导致死循环。
其他我出现的问题在代码中标示出来了。。

因为有循环遍历,并且还有移动操作。也就是n*(n-1)*O(1)*n
所以时间复杂度时O(n^3)

肯定有更好的思路。。
待续。。。


0 0