0
点赞
收藏
分享

微信扫一扫

设计模式:生活中的迭代器模式

唯米天空 04-08 06:00 阅读 1
生活算法

明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入

有2行,第1行为1个正整数,表示所生成的随机数的个数:N;
第2行有N个用空格隔开的正整数,为所产生的随机数。

输出

也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例输入

10
20 40 32 67 40 20 89 300 400 15

样例输出

8
15 20 32 40 67 89 300 400

解题思路

·题目输出要求有去重,经过之前的题目,我们已经知道,去重可以使用set,并且题目还有要求要从小到大排序,所以,使用set在本题使用,正好合适

代码如下

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int main() {
	int n; cin >> n;
	vector<int> nums(n);
	set<int> ans;
	for (int i = 0; i < n; i++) {
		cin >> nums[i];
		ans.insert(nums[i]);//将数组中元素存入set中
	}
	cout << ans.size()<<endl;
	for (auto it : ans) {
		cout << it << " ";
	}
	return 0;
}

总结

本题并没有什么逻辑或者代码实现上的困难,只需要知道只用set工具即可


6翻了

题目描述

“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

输入样例:

it is so 666 really 6666 what else can I say 6666666666

输出样例:

it is so 666 really 9 what else can I say 27

解题思路

·会有的同学想要直接使用替换,但是直接使用替换会有些麻烦(比如长度,边界),可以尝试用另一种思路,直接输出,但是遇到符合条件的再改变

·定义整形变量num用于记录连续出现的数字6

·如果字符是6,则num++

·若字符不是6,则根据num的值进行操作,num>9输出27,num>3则输出9,num不超过3,则连续输出num个数字6

·结束当前字符,并将num重置为0

代码如下

#include <iostream>
#include <string>

using namespace std;

int main() {
	string s; getline(cin, s);
	int num = 0;
	for (int i = 0; i <= s.length(); i++) {
		if (s[i] == '6') {
			num++;
		}
		else {
			if (num > 9) cout << "27";
			else if (num > 3) cout << "9";
			else {
				while (num--) {
					cout << "6";
				}
			}
			cout << s[i];
			num = 0;
		}
	}
	return 0;
}

总结

还是经常说的,要将复杂问题简单化,找出其中的逻辑思路,不要死钻一个点


吃火锅

题目描述

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1

输入格式:

输入每行给出一句不超过 80 个字符的、以回车结尾的朋友信息,信息为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。当读到某一行只有一个英文句点 . 时,输入结束,此行不算在朋友信息里。

输出格式:

首先在一行中输出朋友信息的总条数。然后对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1,并且统计这样厉害的信息有多少条。在第二行中首先输出第一次出现 chi1 huo3 guo1 的信息是第几条(从 1 开始计数),然后输出这类信息的总条数,其间以一个空格分隔。题目保证输出的所有数字不超过 100。

如果朋友从头到尾都没提 chi1 huo3 guo1 这个关键词,则在第二行输出一个表情 -_-#

输入样例 1:

Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

输出样例 1:

5
3 2

输入样例 2:

Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.

输出样例 2:

5
-_-#

解题思路

·定义俩个字符串,一个用来输入字符串s1,一个用来存放目标字符串s2

·定义一个 sum1 用来统计信息总行数,一个sum2用来统计关键词总条数,一个idx 记录首场出现信息的行数

·用while循环输入字符串s1,如果s1是结束字符"."的话则跳出循环

·sum1++进行记录信息的个数,用find寻找s1中是否存在s2,如果存在用sum2进行记录,如果是第一次出现,用idx进行记录是第几行出现的

·最后根据sum2,也就是s1中有s2信息的个数进行相对应的输出

代码如下:

#include <iostream>
#include <string>

using namespace std;

int main() {
	string s1, s2;
	s2 = "chi1 huo3 guo1";
	int sum1 = 0;
	int sum2 = 0;
	int index;
	while (getline(cin, s1)) {
		if (s1 == ".")
			break;
		sum1++;
		if (s1.find(s2) != -1) {
			sum2++;
			if (sum2 == 1)
				index = sum1;
		}
	}
	if (sum2) {
		cout << sum1 << endl;
		cout << index << " " << sum2 << endl;
	}
	else {
		cout << sum1 << endl;
		cout << "-_-#" << endl;
	}
	return 0;
}
举报

相关推荐

0 条评论