华为招聘机试整理1:删除子串
题目:删除子串
题目描写叙述:
仅仅要是原串中有同样的子串就删掉,无论有多少个,返回子串的个数。
题目分析:
我们对照该题与《HWOJ 在一个字符中删除第二个字符出现过的全部字符》《HWOJ 实现一个听高级的字符匹配算法》都是不一样的。一定要注意区分
所以我们这道题不适合用哈希表来完毕。
我们能够利用指针来完毕
算法思路:
①利用字符串str循环。之后将和sub_str长度复制给一个新的字符串temp
所以我们这里须要用malloc来动态申请内存空间。而用free来释放malloc申请的空间
这里我们採用什么函数复制呢?memcpy还是strcpy呢?
补充:
strcpy和memcpy主要有下面2方面的差别。
1、复制的内容不同。
strcpy仅仅能复制字符串,而memcpy能够复制随意内容,比如字符数组、整型、结构体、类等。
2、复制的方法不同。
strcpy不须要指定长度,它遇到被复制字符的串结束符" "才结束,所以easy溢出。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++ = ' ';
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++ = ' ';
③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);