1. 程式人生 > >ccf部分題目及答案

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

參考網址: