(一)201312-1 出现次数最多的数
问题描述
给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
输入格式
输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。
输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。
输出格式
输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。
样例输入
6
10 1 10 20 30 20
样例输出
10
分析
13年12月的签到题,没什么难度,甚至都没有什么边界条件或者数据类型中的陷阱。
代码
略
(二)201312-2 ISBN号码
问题描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出是正确的ISBN号码。
输入格式
输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式
输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
样例输入
0-670-82162-4
样例输出
Right
样例输入
0-670-82162-0
样例输出
0-670-82162-4
分析
这个题也比较简单,但是注意一下数据格式吧,比如最后一位可能为X,存储时有所注意。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String ISBN = scanner.next();
int length = ISBN.length();
int r = 0;
int count = 1;
for (int i = 0; i < length - 1; i++) {
char c = ISBN.charAt(i);
if (c != '-') {
r += Integer.parseInt(String.valueOf(c)) * count++;
}
}
r = r % 11;
String sign = String.valueOf(ISBN.charAt(length - 1));
String result = String.valueOf(r);
if (result.equals("10"))
result = "X";
if (result.equals(sign)) {
System.out.println("Right");
} else {
System.out.println(ISBN.substring(0, length - 1) + result);
}
}
}
(三)201903-1 小中大
分析
这个题虽然也是一道签到题,但是比起上面第一道,坑多了不少,对于像我这样没什么经验的,其中的坑基本都命中了。让我细细分析。
首先题目里要求“对于可能出现的分数,请输出四舍五入保留1位小数的结果”,一方面要保留1位小数,另一方面要四舍五入。一定要特别注意分数的情况,以及中位数的类型是浮点数而不是整数。
另外,注意题干里提到已经是顺序或者逆序,所以可以先判断一下端点从而获得max和min,不需要排序了。要排序也可以直接使用sort函数。
代码
#include <bits/stdc++.h>
using namespace std;
int main () {
int n;
int max, min;
cin>>n;
int a[n];
for (int i = 0; i < n; i++)
cin>>a[i];
if (a[n - 1] >= a[0]) {
max = a[n - 1];
min = a[0];
} else {
max = a[0];
min = a[n - 1];
}
double m;
if (n % 2 == 0) {
m = (a[n / 2] + a[n / 2 - 1]) / 2.0;
} else {
m = a[n / 2];
}
int pre = (m > 0 &&m-(int)m<0.01) || (m < 0 && m - (int)m > -0.01) || m == 0 ?0:1;
cout<<max<<" "<<setiosflags(ios::fixed)<<setprecision(pre)<<m<<" "<<min<<endl;
}