温度统计
现有一段时间的温度数据,请统计指定温度出现的次数。
输入
第一行一个整数n,表示温度数据的个数。(0 < n ≤ 200) 第二行n个整数,以空格分隔,每个整数表示一个温度,温度的范围大于等于0,小于等于40。 第三行一个整数,表示需要查询的温度t。(0 ≤ t ≤ 40)
输出
输出一个整数,表示温度t出现的次数。
样例输入
10
18 19 21 17 20 18 21 21 22 21
21
样例输出
4
考点:对一维数组操作
核心:判断+计数
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int arr[n];//存一段时间的温度
for (int a = 0; a < n; a++)
cin >> arr[a];
int t, count = 0; //指定的温度,计数器
cin >> t; //指定的温度
for (int b = 0; b < n; b++)
{
if (arr[b] == t)
count++;
}
cout << count;
return 0;
}
序列排序
对于给定的正整数序列,按照每个数的各位数和从大到小排序,各位数和相同的按照本身大小排序,大的在前,小的在后。
输入
第一行1个整数n,表示序列的大小。( 0 < n ≤ 1000) 第二行n个正整数,表示序列的每个数,每个数不大于100000000。
输出
输出按照题目要求排序后的序列
样例输入
6
17 26 9 13 88 10
样例输出
88 9 26 17 13 10
考点:有条件的排序
核心:对数求位数和,判断排序条件
#include <bits/stdc++.h>
using namespace std;
//方法1
bool cmp(int a, int b)//改写sort函数排序规则
{
int sum1 = 0, sum2 = 0;
while (a != 0) //前一个数字位数求和
{
sum1 += a % 10;
a /= 10;
}
while (b != 0) //后一个数字位数求和
{
sum2 += b % 10;
b /= 10;
}
if (sum1 > sum2) //按照每个数的各位数和从大到小排序
return true;
else if (sum1 == sum2) //各位数和相同的按照本身大小排序,大的在前,小的在后。
{
if (a >= b)
return true;
else
return false;
}
else if (sum1 < sum2)
return false;
}
int main()
{
int n;
cin >> n;
int arr[n];
for (int a = 0; a < n; a++)
cin >> arr[a];
sort(arr, arr + n, cmp);
for (int b = 0; b < n; b++)
cout << arr[b] << " ";
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int jia(int a)//把位数求和封装成一个函数,方便调用
{
int sum = 0;
while (a != 0)
{
sum += a % 10;
a /= 10;
}
return sum;
}
int main()
{
int n;
cin >> n;
int arr[n], sum[n]; //存原本的数,存位数求和后的数
for (int a = 0; a < n; a++)
{
cin >> arr[a];
sum[a] = jia(arr[a]); //将原本的数经过求和后赋值给求和的数组
}
for (int a = 0; a < n; a++)
{
for (int b = 0; b < n - a - 1; b++)
{
//按照每个数的各位数和从大到小排序,各位数和相同的按照本身大小排序,大的在前,小的在后。
if (sum[b] < sum[b + 1] || (sum[b] == sum[b + 1] && arr[b] < arr[b + 1]))
{
swap(sum[b], sum[b + 1]);
swap(arr[b], arr[b + 1]);
}
}
}
for (int b = 0; b < n; b++)
cout << arr[b] << " ";
return 0;
}
单词的长度
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请对应地计算各个单词的长度。注意,如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没有被空格间开的符号串,都算作单词。
输入
一行单词序列,最少1个单词,最多300个单词,单词之间用至少1个空格间隔。单词序列总长度不超过1000。
输出
依次输出对应单词的长度,之间以逗号间隔。
样例输入
She was born in 1990-01-02 and from Beijing city.
样例输出
3,3,4,2,10,3,4,7,5
考点:字符串处理
核心:对计数条件判断
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin, s);
int count = 0;
for (int a = 0; a < s.length(); a++)
{
if (s[a] != ' ') //没有遇到空格
count++;
else if (s[a] == ' ' && s[a + 1] != ' ')
{
cout << count << ',';
count = 0; //重新计数
}
}
cout << count; //补上最后一个计数结果,后面没有逗号
return 0;
}
扫雷游戏地雷数计算
扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。
注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。
输入
第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。 接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。
输出
n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
样例输入
3 3
??
???
??
样例输出
10
221
11
考点:对二维数组的操作
核心:对周围方向的判断
方法1
方法2
古代密码
古罗马帝国有一个拥有各种部门的强大政府组织。其中一个部门就是保密服务部门。为了保险起见,在省与省之间传递的重要文件中的大写字母是加密的。当时最流行的加密方法是替换和重新排列。
替换方法是将所有出现的字符替换成其它的字符。有些字符会替换成它自己。例如:替换规则可以是将’A’ 到 'Y’替换成它的下一个字符,将’Z’替换成 ‘A’,如果原词是 “VICTORIOUS” 则它变成 “WJDUPSJPVT”。
排列方法改变原来单词中字母的顺序。例如:将顺序例如将顺序 < 2 1 5 4 3 7 6 10 9 8 > 应用到 “VICTORIOUS” 上,则得到"IVOTCIRSUO"。
人们很快意识到单独应用替换方法或排列方法加密,都是很不保险的。但是如果结合这两种方法,在当时就可以得到非常可靠的加密方法。所以,很多重要信息先使用替换方法加密,再将加密的结果用排列的方法加密。用两种方法结合就可以将"VICTORIOUS" 加密成"JWPUDJSTVP"。
考古学家最近在一个石台上发现了一些信息。初看起来它们毫无意义,所以有人设想它们可能是用替换和排列的方法被加密了。人们试着解读了石台上的密码,现在他们想检查解读的是否正确。他们需要一个计算机程序来验证,你的任务就是写这个验证程序。
输入
输入有两行。第一行是石台上的文字。文字中没有空格,并且只有大写英文字母。第二行是被解读出来的加密前的文字。第二行也是由大写英文字母构成的。 两行字符数目的长度都不超过100。
输出
如果第二行经过某种加密方法后可以产生第一行的信息,输出 “YES”,否则输出"NO"。
样例输入
JWPUDJSTVP
VICTORIOUS
样例输出
YES
考点:字符串,排序
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
bool flag=true;
cin>>s1>>s2;
for(int a=0;a<s2.length();a++)
{
if(s2[a]>='A'&&s1[a]<='Y')
s2[a]=s2[a]+1;
else if(s2[a]=='Z')
s2[a]='A';
}
sort(s1.begin(),s1.end());//对字符串进行排序(字典序)
sort(s2.begin(),s2.end());
for(int a=0;a<s1.length();a++)
{
if(s1[a]!=s2[a])
{
cout<<"NO";
flag=false;
}
}
if(flag==true)
cout<<"YES";
return 0;
}
单词倒排
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
输入:输入为一个字符串(字符串长度至多为100)。
输出:输出为按要求排序后的字符串。
样例输入I am a student
样例输出student a am I
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;//用于输入的字符串
getline(cin,s);
vector<string> word;//定义字符串类型的动态数组存单词
s=s+' ';//字符串后连接一个空格用来确保单词全部存入动态数组里
int x=0;//目标遍历到的字符的位置
for(int a=0;a<s.length();a++)
{
if(s[a]==' ')
{
//遇到了空格说明已经遍历完一个单词了
word.push_back(s.substr(x,a-x));//提取子串存入动态数组
x=a+1;
}
}
for(int a=word.size()-1;a>=0;a--)
cout<<word[a]<<" ";
return 0;
}
单词排序
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)
输入:一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。数据不含除字母、空格外的其他字符。
输出:按字典序输出这些单词,重复的单词只输出一次。
样例输入She wants to go to Peking University to study Chinese
样例输出
Chinese
Peking
She
University
go
study
to
wants
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin, s);
vector<string> word;//创建string类型动态数组用来存单词
int x = 0;
s = s + ' '; //字符串后加一个空格用做最后一个单词的判断
for (int a = 0; a < s.length(); a++)
{
if (s[a] == ' ') //当遇到空格就说遍历完一个单词了
{
word.push_back(s.substr(x, a - x)); //提取单词放进动态数组中
x = a + 1;
}
}
sort(word.begin(), word.end());
for (int a = 0; a < word.size(); a++)
if ((word[a] != word[a - 1]) && (word[a].empty() != true))
cout << word[a] << endl;
return 0;
}
单词的长度
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请对应地计算各个单词的长度。注意,如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没有被空格间开的符号串,都算作单词。
输入
一行单词序列,最少1个单词,最多300个单词,单词之间用至少1个空格间隔。单词序列总长度不超过1000。
输出
依次输出对应单词的长度,之间以逗号间隔。
样例输入
She was born in 1990-01-02 and from Beijing city.
样例输出
3,3,4,2,10,3,4,7,5
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin, s);
vector<string> word;//创建string类型动态数组用来存单词
int x = 0;
s = s + ' '; //字符串后加一个空格用做最后一个单词的判断
for (int a = 0; a < s.length(); a++)
{
if (s[a] == ' ') //当遇到空格就说遍历完一个单词了
{
word.push_back(s.substr(x, a - x)); //提取单词放进动态数组中
x = a + 1;
}
}
for (int a = 0; a < word.size(); a++)
if (word[a].length() != 0)
cout << word[a].length() << ",";
return 0;
}
最长最短单词
输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。
输入:一行句子。
输出:两行输出: 第1行,第一个最长的单词。 第2行,第一个最短的单词。
样例输入
I am studying Programming language C in Peking University
样例输出
Programming
I
提示
如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
vector<string> word;//定义动态string类型数组存单词
int max = 0, min = 101;
getline(cin, s);
s = s + ' '; //确保存入到最后一个单词
int x = 0, count = 0; //当前单词位置,单词长度
for (int a = 0; a < s.length(); a++)
{
if (s[a] == ' ')
{
word.push_back(s.substr(x, a - x));
count++;//记录单词长度
x = a + 1;
}
}
for (int a = 0; a < word.size(); a++)
{
if (word[a].length() >= max)
max = word[a].length();
if (word[a].length() <= min)
min = word[a].length();
}
for (int a = 0; a < word.size(); a++)
if (word[a].length() == max)
{
cout << word[a];
break;
}
cout << endl;
for (int a = 0; a < word.size(); a++)
if (word[a].length() == min)
{
cout << word[a];
break;
}
return 0;
}
方法1:
方法2