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
解题思路:
由于整数的大小为1~10000,所以在内存足够的情况下,直接用整数作为大数组的下标,出现一次,值加一。
再依次遍历找出次数最多的整数并输出,就能保证在次数一样的情况下先输出小的。
Java代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int [] num = new int [10001];
int a=0,max=0;
for(int i=0;i<n;i++) {
a = scan.nextInt();
num[a]+=1;
}
for(int i=0;i<10001;i++) {
if(num[max]<num[i]) {
max = i;
}
}
System.out.print(max);
}
}
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
解题思路:
首先由于输入的字符串非常有规律,所以直接按照编码的位置取出相应位置的数字。并计算对应的识别码。
这道题很容易被漏掉的一点是对于10要转换成“X”的处理。因此在匹配时,应当考虑到双向的转换。
Java代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s1 = scan.next();
String s2 = s1.substring(0, s1.length()-1);
String a = s1.substring(s1.length()-1);
int sum = (s1.charAt(0)-'0')*1+(s1.charAt(2)-'0')*2+(s1.charAt(3)-'0')*3
+(s1.charAt(4)-'0')*4+(s1.charAt(6)-'0')*5+(s1.charAt(7)-'0')*6+
+(s1.charAt(8)-'0')*7+(s1.charAt(9)-'0')*8+(s1.charAt(10)-'0')*9;
int b = sum%11;
int last=0;
if(a.equals("X")) {
last = 10;
}else {
last = Integer.parseInt(a);
}
if(b == last) {
System.out.println("Right");
}else {
if(b == 10) {
System.out.println(s2 + "X");
}else {
System.out.println(s2 + b);
}
}
}
}
3.最大的矩形
问题描述
在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。输出格式
输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6
3 1 6 5 2 3样例输出
10
解题思路:
首先是对题目充分理解之后,可以发现。解这道题的主要思路应该是对所有的矩形高度进行以下操作:
先对单个矩形计算面积,并储存最大面积;
再对两个矩形的情况计算面积,并更新最大面积;一直计算到包含n个矩形的最大面积。这个计算层数就是n。
计算面积时,需要记录两个值,①是目前计算的矩形个数,作为矩形面积的宽;②是目前参与计算的矩形中,最小的高度值;
因此,在实现代码中,使用了两层循环,首先i代表最后的矩形,j代表i之前的矩形,依次尝试组合面积,并不断更新最大面积。直到遍历完所有情况。
Java代码:
import java.util.*;
public class Main5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int [] h = new int [n];
for(int i=0;i<n;i++) {
h[i] = scan.nextInt();
}
int max=0;
for(int i=0;i<n;i++) {
int min = Integer.MAX_VALUE;
for(int j=i;j>=0;j--) {
min=Math.min(h[j], min);
max=Math.max(max, min*(i-j+1));
}
}
System.out.print(max);
}
}