面试题——字符串类型001

 
  
  
#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值