明明的随机数
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了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;
}