华为招聘机试整理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);
相关文章推荐
- 华为招聘机试整理14:数组奇数偶数排序
- 华为招聘机试整理13:算分数的问题
- 华为机试-删除字符串中所有给定的子串
- 华为校园招聘java机试整理
- 华为招聘机试整理9:输入一个字符串,用指针求出字符串的长度
- 华为招聘机试整理5:简单四则运算
- 华为招聘机试整理10:实现字符串中子字符串的替换
- 华为招聘机试整理2:判断一个数组的元素是否是回文
- 华为招聘机试整理9:输入一个字符串,用指针求出字符串的长度
- 华为招聘机试整理3:数组比较
- 华为招聘机试整理10:实现字符串中子字符串的替换
- 华为招聘机试整理4:手机号码合法性判断
- 华为招聘机试整理7:给定一个数组input[]
- 华为招聘机试整理11:实现字符串间隔输出
- (华为机试)删除字符串中相同子串
- 华为机试 删除字符串中所有给定的子串
- 华为招聘机试整理5:简单四则运算
- 华为机试-删除字符串中所有给定的子串
- 华为招聘机试整理12:合并字符串
- 华为招聘机试整理15:约瑟夫环