华为2013机试题

一、删除子串
1、题目描述:
只要是原串中有相同的子串就删掉,不管有多少个,返回子串的个数。
2、题目分析:
我们对比该题与《HWOJ 在一个字符中删除第二个字符出现过的所有字符》《HWOJ 实现一个听高级的字符匹配算法》都是不一样的。一定要注意区分
所以我们这道题不适合用哈希表来完成。
我们可以利用指针来完成
3、算法思路:
利用字符串str循环,之后将和sub_str长度复制给一个新的字符串temp
所以我们这里需要用malloc来动态申请内存空间,而用free来释放malloc申请的空间
这里我们采用什么函数复制呢?memcpy还是strcpy呢?
4、补充:
strcpy和memcpy主要有以下2方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
虽然做的是字符串,所以我们这里因为需要指定长度,所以我们选择用memcpy
之后去比较temp和sub_str,用str_cmp去比较,如果相同说明有相同子串,直接str = str + len1;
如果不同说明没有,直接保存在*result中,且分别加1

 

#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];

cin>>str;

cin>>sub_str;

int num = delete_sub_str(str, sub_str, result);

cout << num << endl;

cout << result << endl;

 

system("pause");

}

二、约瑟夫环

题目:约瑟夫环
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
题目分析:
这道题主要是想考察链表的知识。
算法思路一:用环形链表模拟圆圈
我们这里采用模板库中的std::list来模拟一个环形链表,由于std::list本身不是一个环形结构,所以我们每次迭代器iterator扫描到链表末尾的时候,我们要记得把迭代器移到链表的头部,这样就相当于按照顺序在一个圆圈中遍历了。
算法思路二:利用观察数学规律分析剩下数字的规律还循环或者递归

回文数字判断 
描述:有这样一类数字,他们顺着看和倒着看是相同的数,例如:121,656,2332等,这样的数字就称为:回文数字。判断某数字是否是回文数字。 
运行时间限制:10Sec 
内存限制:128MByte 
输入:整型数字 
输出:0:不是回文数字;1:是回文数字。 
样例输入:121 
样例输出:1 

#include <iostream>

#include <string>

#include <sstream>

using namespace std;

void huiwen(char  str[])

{

int flag = 1;

int len = strlen(str);

for (int i = 0; i<len / 2; i++)

{

if (str[i] != str[len - i - 1])//二分数字,首个数字和末尾数字依次相等

{

flag = 0;//不等,说明不是回文,输出的k0

break;

}

}

cout << flag;//判断是否是回文的标志

}

 

 

void main()

{

char input[100];

cin >> input;

//需要判断输入的是否是整型数字,若不是,输出0,即肯定不是回文数字

for (int i = 0; i < strlen(input); i++)

{

if (!isdigit(input[i]))

{

cout << 0;

return;

}

}

huiwen(input);

cout << endl;

system("pause");

}

 

猜你喜欢

转载自blog.csdn.net/gaopeng1111/article/details/83375727