编程生活day7--明明的随机数、6翻了、吃火锅

明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了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在本题使用,正好合适

代码如下

cpp 复制代码
#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

代码如下

cpp 复制代码
#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信息的个数进行相对应的输出

代码如下:

cpp 复制代码
#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;
}
相关推荐
旺仔仔仔6 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔6 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生6 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川7 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
对空六课7 小时前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析
对空六课7 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析
一勺思维7 小时前
我为什么把 Agent 的核心逻辑从 LangChain 里搬出来手写
算法
碧海银沙音频科技研究院7 小时前
基于炬芯ATS308X的LE aduio LC3编解码算法功能实现
算法
小蒋观天下7 小时前
厂区人员徘徊游荡判别——基于时序轨迹速度的逗留行为分级算法落地
大数据·人工智能·深度学习·算法·机器学习·ai大模型
程序员清风7 小时前
堆与优先队列:从 Top K 到任务调度
java·数据结构·算法