ccf部分題目及答案
阿新 • • 發佈:2019-01-05
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();
}
}
參考網址: