一、删除子串
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;//不等,说明不是回文,输出的k为0
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");
}