您的位置:首页 > 其它

华为招聘机试整理1:删除子串

2014-07-09 12:23 176 查看


华为招聘机试整理1:删除子串

题目:删除子串

题目描述:

只要是原串中有相同的子串就删掉,不管有多少个,返回子串的个数。
题目分析:

我们对比该题与《HWOJ 在一个字符中删除第二个字符出现过的所有字符》《HWOJ 实现一个听高级的字符匹配算法》都是不一样的。一定要注意区分

所以我们这道题不适合用哈希表来完成。

我们可以利用指针来完成
算法思路:

①利用字符串str循环,之后将和sub_str长度复制给一个新的字符串temp

所以我们这里需要用malloc来动态申请内存空间,而用free来释放malloc申请的空间

这里我们采用什么函数复制呢?memcpy还是strcpy呢?

补充:
strcpy和memcpy主要有以下2方面的区别。

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

虽然做的是字符串,所以我们这里因为需要指定长度,所以我们选择用memcpy

③之后去比较temp和sub_str,用str_cmp去比较,如果相同说明有相同子串,直接str = str + len1;

如果不同说明没有,直接保存在*result中,且分别加1

===============================================================================
参考代码:
//删除子串.cpp
//2014.7.9 hepanhui
#include <iostream>
#include <string>
const int maxn = 1000;
using namespace std;

int delete_sub_str(const char *str,const char *sub_str,char *result)
{
//非法输入
if(str == NULL || sub_str == NULL)
return 0;

//初始化
int len1 = strlen(sub_str);
int cnt = 0;
char *temp = NULL;

temp = (char *)malloc(len1 + 1);
while(*str)
{
memset(temp, 0, len1 + 1);
memcpy(temp,str,len1);
if(strcmp(temp,sub_str) == 0)
{
cnt ++;
str = str + len1;
}
else
{
*result = *str;
str++;
result++;
}
}
*result++ = '\0';
free(temp);
return cnt;
}

int main()
{
char str[maxn];
char sub_str[maxn];
char result[maxn];
gets(str);
gets(sub_str);
int num = delete_sub_str(str,sub_str,result);
cout << num << endl;
cout << result << endl;
}


调试过程易犯的错误:

①记住不能对指针或者常量字符串用sizeof求长度;常量转化为非常量字符串,需要强制类型转换;所以我们初始化的时候不能用sizeof(temp)

②记住需要加上result++ = '\0';

③malloc返回值是void ,申请时需要强制转换成需要的类型,所以(char
)不能忘记

④必须每次循环都要把temp清空,申请的区域值是随机的

综上所述,我们以后需要动态申请内存空间的时候,

1)初始化 char *temp = NULL

2)申请内存空间temp = (char *)malloc(len1 + 1); 这里还需要注意如果是整型长度记得要加上sizeof(int)

score=(int*)malloc(sizeof(int)*(n+1));

3)清空memset(temp, 0, len1 + 1);

4)释放内存free(temp);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: