CCF 201312 前三题 Java解法

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,所以在内存足够的情况下,直接用整数作为大数组的下标,出现一次,值加一。

再依次遍历找出次数最多的整数并输出,就能保证在次数一样的情况下先输出小的。

扫描二维码关注公众号,回复: 12683997 查看本文章

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);
	}
}

猜你喜欢

转载自blog.csdn.net/paranior/article/details/108284265