CCF认证java模拟试题(附加答案)

模拟练习试题参考答案(Java)

为了帮助大家熟悉CCF 软件能力认证考试的操作方式与答题环境,了解试题的大致难度,做好考前的准备,故在此提供试题的参考答案。Java程序是灵活的,为了解决同一个问题,即使结果相同,程序的内容也不一定是完全一致的,仅供各位在练习时参考。

1. 出现次数最多的数

import java.util.*;

 

public class Main {   public static void main(String[] args){     new Main().run();

 }

 

 public void run() {

   Scanner fin = new Scanner(System.in);

 

   int N = fin.nextInt();     int[]count = new int[10001];     for (int i =0; i < N; ++i) {

      ++count[fin.nextInt()];

   }

 

   int maxCount = -1;     int result= 0;     for (int i = 1; i <= 10000;++i) {       if (count[i] > maxCount){         maxCount = count[i];         result = i;

      }

   }

 

   System.out.println(result);

 }

}

 

2.ISBN号码

import java.io.BufferedReader; import java.io.InputStreamReader;public class Main {    public static void main(String args[]) {

                 

                 BufferedReader bin = newBufferedReader(new InputStreamReader(System.in));              try{

                         int sum=0;char cc='0';                  Stringisbn_0 = bin.readLine();

                         String isbn =isbn_0.replace("-", "");

                         

                         for(int i=0; i<9; i++){                               intii = (int)isbn.charAt(i)-48;                            sum += ii * (i+1);

                         }

                         sum = sum % 11;

                         if(sum == 10) cc = 'X';//                          elsecc = (char)(sum+48);                 if(cc == isbn.charAt(9))System.out.println("Right");

                         else{

                                 isbn_0 = isbn_0.substring(0,12) + cc;

                                  System.out.println(isbn_0);

                         }

                  }catch(Exception e){

                         e.printStackTrace();

                 }

         }

}

 

3.最大的矩形

import java.util.*;

 

public class Main {   publicstatic void main(String[] args) {     newMain().run();

 }

 

 public void run() {

   Scanner fin = new Scanner(System.in);

 

    int N =fin.nextInt();     int[] height = newint[N];     for (int i = 0; i < N;++i) height[i] = fin.nextInt();

 

    int result = 0;     for (int i = 0; i < N; ++i) {       int width = 1;

      for (int j = i - 1; j>= 0; --j) {         if (height[j]< height[i]) break;        ++width;       }

      for (int j = i + 1; j< N; ++j) {         if (height[j] <height[i]) break;         ++width;       }      int area = width * height[i];       result = Math.max(result, area);

   }

 

   System.out.println(result);

 }

}

 


4.有趣的数

import java.util.*;

 

public class Main {   publicstatic void main(String[] args) {     newMain().run();

 }

 

 public void run() {

   Scanner fin = new Scanner(System.in);

 

    int N =fin.nextInt();     long[] count = newlong[8];     count[6] = 0;     count[7] = 1;     long mod = 1000000007;     for (int i = 2; i <= N; ++i) {       long[] newCount = new long[8];       newCount[0] = (count[0] * 2 + count[1] +count[3]) % mod;       newCount[1] =(count[1] * 2 + count[2] + count[5]) % mod;       newCount[2] = (count[2] + count[6]) %mod;       newCount[3] = (count[3] * 2 +count[4] + count[5]) % mod;      newCount[4] = (count[4] + count[7]) % mod;       newCount[5] = (count[5] * 2 + count[6] +count[7]) % mod;       newCount[6] =0;       newCount[7] = 1;

 

     count = newCount;

   }

 

   System.out.println(count[0]);

 }

}

 

5.I’m stuck!

import java.util.*;

 

public class Main {   publicstatic void main(String[] args) {     newMain().run();

 }

 

 public void run() {

   Scanner fin = new Scanner(System.in);

 

    int R = fin.nextInt();     int C = fin.nextInt();     fin.nextLine();     int[][] board = new int[R + 2][C +2];     int rowStart = 0, colStart = 0,rowEnd = 0, colEnd = 0;     for (int i =1; i <= R; ++i) {       String line =fin.nextLine();       for (int j = 1; j<= C; ++j) {         char c =line.charAt(j - 1);         switch (c) {

          case '#':break;           case '-': board[i][j] =5; break;           case '|': board[i][j]= 0xA; break;           case '+':           case 'S':           case 'T':

                   board[i][j] = 0xF; break;          case '.': board[i][j] = 0x8; break;           default: break;

        }

 

        if (c == 'S') {           rowStart = i;           colStart = j;         } else if (c == 'T') {           rowEnd = i;           colEnd = j;

        }

     }

   }

 

    int[] dr = new int[] {0,-1, 0, 1};     int[] dc = new int[] {1,0, -1, 0};

 

    // Scan 1: find all cellswhich can reach T     boolean[][] visited= new boolean[R + 2][C + 2];     boolean[][]canReachT = new boolean[R + 2][C + 2];    initVisited(visited);    canReachT[rowEnd][colEnd] = true;    visited[rowEnd][colEnd] = true;

 

    Queue<Integer> queue= new LinkedList<Integer>();    queue.add(rowEnd);    queue.add(colEnd);     while(!queue.isEmpty()) {       int r =queue.remove();       int c =queue.remove();

 

      for (int i = 0; i < 4; ++i) {         int nr = r + dr[i];

        int nc = c +dc[i];         if (visited[nr][nc])continue;         if ((board[nr][nc]& (1 << ((i + 2) % 4))) != 0) {           canReachT[nr][nc] = true;           queue.add(nr);           queue.add(nc);           visited[nr][nc] = true;

        }

     }

   }

 

   /*

    for (int i = 1; i <= R;++i) {       for (int j = 1; j <= C;++j) {         if (canReachT[i][j]) {

          System.out.println("i = " +i + ", j = " + j);

        }

     }

    }     */

    if(!canReachT[rowStart][colStart]) {      System.out.println("I'm stuck!");       return;

   }

 

    // Scan 2: get result     boolean[][] rCanReach = new boolean[R +2][C + 2];     initVisited(visited);     queue.clear();     visited[rowStart][colStart] = true;     rCanReach[rowStart][colStart] = true;     queue.add(rowStart);     queue.add(colStart);

 

    while (!queue.isEmpty()){       int r = queue.remove();       int c = queue.remove();

 

      for (int i = 0; i <4; ++i) {         if ((board[r][c] &(1 << i)) == 0) continue;        int nr = r + dr[i];         int nc= c + dc[i];         if (visited[nr][nc])continue;         if (board[nr][nc] == 0)continue;

 

        rCanReach[nr][nc] =true;         queue.add(nr);         queue.add(nc);         visited[nr][nc] = true;

     }

   }

 

    int result = 0;     for (int i = 1; i <= R; ++i) {       for (int j = 1; j <= C; ++j) {

        /*         if (rCanReach[i][j]) {

          System.out.println("i = " +i + ", j = " + j);

        }         */         if (rCanReach[i][j] &&(!canReachT[i][j])) ++result;

     }

   }

   System.out.println(result);

 }

 

  private voidinitVisited(boolean[][] visited) {    int R = visited.length - 2;    int C = visited[0].length - 2;    for (int i = 0; i <= R + 1; ++i) {       visited[i][0] = true;       visited[i][C + 1] = true;

   }

    for (int j = 0; j <= C+ 1; ++j) {       visited[0][j] =true;       visited[R + 1][j] = true;

   }

    for (int i = 1; i <= R; ++i) {       for (int j = 1; j <= C; ++j) {         visited[i][j] = false;

     }

   }

 }

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值