ccf部分题目及答案

CCF部分机考题题目收集:

参照网上的题目和答案,自己也把这些题一个个敲代码实现了一遍,现记录下来,以防忘记。

题目一:


问题描述

试题编号: 试题名称: 时间限制: 内存限制:
201509-1 数列分段 1.0s 256.0MB
问题描述
给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式输入的第一行包含一个整数n,表示数列中整数的个数。
第二行包含n个整数a1, a2, „, an,表示给定的数列,相邻的整数之间用一个空格分隔。 输出格式, 输出一个整数,表示给定的数列有多个段。

样例输入
问题描述:
8
8 8 8 0 12 12 8 0
样例输出
5
样例说明
8 8 8是第一段,0是第二段,12 12是第三段,倒数第二个整数8是第四段,
最后一个0是第五段。 评测用例规模与约定
1 ≤ n ≤ 1000,0 ≤ ai ≤ 1000。

实现代码:

public class Question1 {

	
	public static void main(String[] args) {
		new Question1().run();
	}
	public void run(){
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt(); //整数的个数
		int[] array = new int[n];  //用长度为n的整数数组来存储输入的整数
		for (int i = 0; i < n; i++) {
			array[i] = scanner.nextInt(); //输入
		}
		int count = 1;
		for (int i = 0; i < n - 1; i++) {
			if (array[i] == array[i + 1]) {
				
			}else {
				count += 1;
			}
		}
		System.out.println(count);
		scanner.close();
	}
}

题目二:


问题描述

给定一个年份y和一个整数d,问这一年的第d天是几月几日?
注意闰年的2月有29天。满足下面条件之一的是闰年: 1) 年份是4的整数倍,而且不是100的整数倍;2) 年份是400的整数倍。
输入格式:
输入的第一行包含一个整数y,表示年份,年份在1900到2015之间(包含1900和2015)。输入的第二行包含一个整数d,d在1至365之间。
输出格式:
输出两行,每行一个整数,分别表示答案的月份和日期。
样例输入:
2015 80
样例输出:
3 21
样例输入:
2000 40
样例输出:
2 9

实现代码:

public class Question2 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int year = scanner.nextInt();
		int days = scanner.nextInt();
		int[] array = getOutput(year, days);
		System.out.println(array[0]+" "+array[1]);
		scanner.close();
	}
	
	/**
	 * 根据月份获取当月多少天
	 * @param month
	 * @return
	 */
	public static int getDays(int year,int month){
		boolean isLeapYear = false;
		if (year % 4 == 0 && year % 400 != 0) {
			isLeapYear = true;
		}
		int days = 0;
		switch (month) {
		case 1:
			days = 31;
			break;
		case 2:
			if (isLeapYear) {
				days = 29;
			}else {
				days = 28;
			}
			break;
		case 3: 
			days = 31;
			break;
		case 4:
			days = 30;
			break;
		case 5:
			days = 31;
			break;
		case 6:
			days = 30;
			break;
		case 7:
			days = 31;
			break;
		case 8:
			days = 31;
			break;
		case 9:
			days = 30;
			break;
		case 10:
			days = 31;
			break;
		case 11:
			days = 30;
			break;
		case 12:
			days = 12;
			break;
		default:
			break;
		}
		return days;
	}
	/**
	 * 获取输出(月份、天数)存入到int[]
	 * @param year
	 * @param days
	 * @return
	 */
	public static int[] getOutput(int year,int days){
		int tmpDays = 0;
		int countMonth = 1;
		while(tmpDays < days){
			tmpDays += getDays(year, countMonth);
			countMonth++;
		}
		int[] array = new int[2];
		array[0] = countMonth - 1;
		array[1] = days - (tmpDays - getDays(year, countMonth - 1));
		return array;
	}
	
}

题目三:


问题描述

  旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。
输入格式
  输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。接下来n行每行包含m个整数,表示输入的图像。
输出格式
  输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
样例输入
2 3
1 5 3
3 2 4
样例输出
3 4
5 2
1 3
评测用例规模与约定
1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。

实现代码:

public class Question3 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int m = scanner.nextInt();
		int[][] array = new int[n][m];//用二维数组来表示矩阵
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				array[i][j] = scanner.nextInt();//矩阵的输入
			}
		}
		for (int i = m - 1; i >= 0; i--) {
			for (int j = 0; j < n; j++) {
				System.out.print(array[j][i]+ " ");//输出
			}
			System.out.println();
		}
		scanner.close();
	}
}

题目四:


问题描述

  涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录, 请问每一条记录中的读者是第几次出现。
输入格式
  输入的第一行包含一个整数n,表示涛涛的记录条数。第二行包含n个整数,依次表示涛涛的记录中每位读者的编号。
输出格式
  输出一行,包含n个整数,由空格分隔,依次表示每条记录中的读者编号是第几次出现。
样例输入
5
1 2 1 1 3
样例输出a
1 1 2 3 1
评测用例规模与约定
1≤n≤1,000,读者的编号为不超过n的正整数。

实现代码:

public class Question4 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] array = new int[n];//数组保存读者来访记录
		for (int i = 0; i < array.length; i++) {
			array[i] = scanner.nextInt();//输入
		}
		for (int i = 0; i < n; i++) {
			int count = 1;  //计数器,默认值为1,因为每一个记录最少次数为1
			if (i == 0) {
				System.out.print(count+" ");//第一个记录出现次数一定为1
			}else {
				for (int j = 0; j < i; j++) {
					if (array[j] == array[i]) {
						count++;    //前面出现一次记录则计数器加一
					}
				}
				System.out.print(count+" ");
			}
		}
		scanner.close();
	}
}

题目五:

问题描述

  给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。
输入格式
  输入的第一行包含一个整数n,表示给定整数的个数。第二行包含所给定的n个整数。
输出格式
  输出一个整数,表示值正好相差1的数对的个数。
样例输入
6
10 2 6 3 7 8
样例输出
3
样例说明
  值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。
评测用例规模与约定
  1<=n<=1000,给定的整数为不超过10000的非负整数。

实现代码:

public class Question5 {

	
	public static void main(String[] args) {
		new Question5().run2();
	}
	
	/**
	 * 解法一
	 */
	public void run1(){
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] array = new int[n];
		for (int i = 0; i < n; i++) {
			array[i] = scanner.nextInt();
		}
		int count = 0;
		for (int i = 0; i < n - 1; i++) {
			for(int j = i + 1;j < n;j++){
				if (Math.abs(array[i] - array[j]) == 1) {
					count++;
				}
			}
		}
		System.out.println(count);
		scanner.close();
	}
	
	/**
	 * 解法二
	 */
	public void run2(){
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] array = new int[10000];
		for (int i = 0; i < n; i++) {
			array[scanner.nextInt()]++;
		}
		int count = 0;//计数器
		for (int i = 0; i < 9999; i++) {
			count += Math.min(array[i], array[i + 1]);
			
		}
		System.out.println(count);
		scanner.close();
	}
}

题目六:

问题描述

  有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
输入格式
  第一行包含一个正整数 N。(1 ≤ N ≤ 500)。第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
输出格式
  只输出一个整数,即这 N 个数中包含多少对相反数。
样例输入
5
1 2 3 -1 -2
样例输出
2

实现代码:

public class Question6 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] array = new int[n];
		for (int i = 0; i < n; i++) {
			array[i] = scanner.nextInt();
		}
		int count = 0;
		for (int i = 0; i < n - 1; i++) {
			for (int j = i + 1; j < n; j++) {
				if (array[i] + array[j] == 0) {
					count++;
					break;
				}
			}
		}
		System.out.println(count);
		scanner.close();
	}
}


题目七:

问题描述

  在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:
对于下面的4×4的矩阵,
  1 5 3 9
  3 7 5 6
  9 4 6 4
  7 3 1 3
  对其进行Z字形扫描后得到长度为16的序列:
  1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
  请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。
输入格式
  输入的第一行包含一个整数n,表示矩阵的大小。输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。
输出格式
  输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。

实现代码:

public class Question7 {

	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[][] array = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				array[i][j] = scanner.nextInt();
			}
		}
		
		for (int i = 0; i < n; i++) {
			if (i == 0) {
				System.out.print(array[i][i]+" ");
			}else {
				int a = Integer.MAX_VALUE;int b = Integer.MAX_VALUE;
				if (i % 2 == 1) {
					a = 0;b = i;
					while(b != -1){
						System.out.print(array[a][b]+" ");
						a++;
						b--;
					}
					continue;
				}else {
					a = i;b = 0;
					while(a != -1){
						System.out.print(array[a][b]+ " ");
						a--;
						b++;
					}
				}
			}
		}
		int tmp = 1;
		for (int i = n; i < 2*n - 1; i++) {
			
			if (i == 2*n - 2) {
				System.out.print(array[n - 1][n - 1]);
			}else {
				if (i % 2 == 1) {
					int a = tmp;int b = i - a;
					while(b != tmp - 1){
						System.out.print(array[a][b]+" ");
						a++;
						b--;
					}
					tmp++;
				}else {
					int b = tmp;int a = i - b;
					while(a != tmp - 1){
						System.out.print(array[a][b]+" ");
						b++;
						a--;
					}
					tmp++;
				}
				
			}
		}
		scanner.close();
	}
}

题目八:

问题描述

      在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,  纵坐标范围从y1到y2之间的区域涂上颜色。下图给出了一个画了两个矩形的例子。
  第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。
  第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。
  图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。
  在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。
输入格式
  输入的第一行包含一个整数n,表示要画的矩形的个数。接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
输出格式
  输出一个整数,表示有多少个单位的面积被涂上颜色。
样例输入
2
1 1 4 4
2 3 6 5
样例输出
15
评测用例规模与约定
1<=n<=100,0<=横坐标、纵坐标<=100。

实现代码:

public class Question8 {

	public static void main(String[] args) {
		new Question8().run();
	}
	/**
	 * 坐标标记法(解决重复区域不确定的问题)
	 */
	public void run(){
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[][] array = new int[101][101];
		for (int i = 0; i < n; i++) {
			int x1 = scanner.nextInt();
			int y1 = scanner.nextInt();
			int x2 = scanner.nextInt();
			int y2 = scanner.nextInt();
			for (int j = x1; j < x2; j++) {
				for (int j2 = y1; j2 < y2; j2++) {
					array[j][j2] = 1;//将已经覆盖的区域用1标记
				}
			}
		}
		int result = 0;
		for (int i = 0; i < 101; i++) {
			for (int j = 0; j < 101; j++) {
				if (array[i][j] == 1) {
					result += 1;
				}
			}
		}
		System.out.println(result);
		scanner.close();
	}
}

题目九:

问题描述

  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和 小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
  输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

实现代码:

public class Question9 {

	public static void main(String[] args) {
		new Question9().run();
	}
	public void run(){
		Scanner scanner = new Scanner(System.in);
		String str = scanner.nextLine();
		int flag = scanner.nextInt();
		int n = scanner.nextInt();
		scanner.nextLine();
		String[] array = new String[n];
		for (int i = 0; i < n; i++) {
			array[i] = scanner.nextLine();
		}
		if (flag == 0) {
			String newStr = str.toUpperCase();
			for (int i = 0; i < n; i++) {
				if (array[i].toUpperCase().contains(newStr)) {
					System.out.println(array[i]);
				}
			}
		}else if(flag == 1){
			for (int i = 0; i < n; i++) {
				if (array[i].contains(str)) {
					System.out.println(array[i]);
				}
			}
		}else {
			
		}
		scanner.close();
	}
}

参考网址:

http://blog.csdn.net/dingding_12345/article/details/47706097

http://www.chinadmd.com/file/utoticasvip3oix6w3v6v6cw_2.html

你可能感兴趣的:(ccf机考题,题目及答案)