ccf2015試題(java)

ccf2015試題(java)

剛剛考完ccf的試題。。。還是基礎掌握的不紮實,五道題4個小時,只做出來三道題,而且沒有考慮複雜的情況。。考試時間匆忙,所以沒加註釋。


/*
問題1
問題描述
  旋轉是圖像處理的基本操作,在這個問題中,你需要將一個圖像逆時針旋轉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的非負整數。*/

//我的實現
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Main m = new Main();
        m.exam_1();
    }

    public void exam_1(){
        int n=0,m=0;

        Scanner s = new Scanner(System.in);
        //get n and m
        while(true){
            n = s.nextInt();
            m = s.nextInt();

            if(n>=1 && n<=1000 && m>=1 && m<=1000)
                break;
        }

        int array[][] = new int[n][m];
        int array_result[][] =new int[m][n];
        //get content
        for(int row=0;row<n;row++){
            for(int clo=0;clo<m;clo++){
                array[row][clo] = s.nextInt();
            }
        }

        for(int row_a=0;row_a<n;row_a++){
            int temp[] = new int[m];

            for(int clo_a=0;clo_a<m;clo_a++){
                temp[clo_a] = array[row_a][clo_a];
            }

            for(int clo_b=row_a;clo_b<n;clo_b++){
                for(int row_b=m-1;row_b>=0;row_b--){
                    array_result[row_b][clo_b] = temp[m-1-row_b];
                }
            }

        }
        for(int row=0;row<m;row++){
            for(int clo=0;clo<n;clo++){
                if(clo == n-1)
                    System.out.print(array_result[row][clo]);
                else
                    System.out.print(array_result[row][clo]+" ");
            }
            System.out.println();
        }

    }
}
/*第二題
問題描述
  給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。
輸入格式
  輸入的第一行包含一個整數n,表示給定數字的個數。
  第二行包含n個整數,相鄰的整數之間用一個空格分隔,表示所給定的整數。
輸出格式
  輸出多行,每行包含兩個整數,分別表示一個給定的整數和它出現的次數。按出現次數遞減的順序輸出。如果兩個整數出現的次數一樣多,則先輸出值較小的,然後輸出值較大的。
樣例輸入
12
5 2 3 3 1 3 4 2 5 2 3 5
樣例輸出
3 4
2 3
5 3
1 1
4 1
評測用例規模與約定
  1 ≤ n ≤ 1000,給出的數都是不超過1000的非負整數。
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Main m = new Main();
        m.exam_2(); 
    }
    public void exam_2(){
        int num = 0;
        HashMap<String,Integer> result = 
                new HashMap<String,Integer>();
        Scanner s = new Scanner(System.in);
        while(true){
            num = s.nextInt();
            if(num>=1 && num<=1000)
                break;
        }

        int array[] = new int[num];
        for(int i=0;i<array.length;i++)
            array[i] = s.nextInt();

        for(int i:array){
            Integer time = result.get(Integer.toString(i));
            if(time == null){
                result.put(Integer.toString(i),1);
            }else{
                result.put(Integer.toString(i), ++time);
            }
        }


        Iterator<Entry<String,Integer>> itEntry = result.entrySet().iterator();
        ArrayList<String> strArr = new ArrayList<String>();
        while(itEntry.hasNext()){
            strArr.add(itEntry.next().getKey());
        }
        int v_arr[] = new int[strArr.size()];
        int temp_ = 0;
        for(String s2:strArr){
            v_arr[temp_] = result.get(s2);
            temp_++;
        }

        for(int k=1;k<v_arr.length;k++)
        for(int i=0;i<v_arr.length-k;i++){
            if(v_arr[i]<v_arr[i+1]){
                int temp = v_arr[i];
                v_arr[i] = v_arr[i+1];
                v_arr[i+1] = temp;
            }
        }

        int index = 0;

        while(!result.isEmpty()){
            for(String s2:strArr){
                if(result.get(s2) != null)
                    if(result.get(s2) == v_arr[index]){
                        System.out.println(s2+" "+v_arr[index]);
                        result.remove(s2);
                        index++;
                    }
            }
        }

    }
}

第三題是關於時間換算的,就是規定一個日期是周幾,然後讓你推算某年某月第x個週週幾的幾號類似這樣的問題。。。看得頭疼,就直接跳過去看第四題了。

第四題是有關於樹的一道題。。大概思路是求樹最遠的兩個葉子節點之間的距離(再考慮題目中的一些設定),沒有記錄題目,就直接上代碼。代碼裏面沒有考慮臨界問題。。寫的不完善

2015年3月30日10:35:49補充
缺少一種情況的考慮,即
1
2
3
4 5
像這樣的情況,一層二層三層都只有一個結點,算法的結果是2。但是正確結果應該是3,應該在main方法中將max與level最大層數進行下比較。。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Main m = new Main();
        ArrayList<TreeNode> arr = m.createTree();
        int res = m.getSingle(arr);
        int[] arr_in = m.getLastLevel(arr);

        int max = arr_in[0]+arr_in[1]-2-2*(res-1);
        System.out.println(max);
    }

    public ArrayList<TreeNode> createTree(){
        int comput_num=0,router_num = 0;

        Scanner s = new Scanner(System.in);

        router_num = s.nextInt();
        comput_num = s.nextInt();

        ArrayList<TreeNode> treeArr = new ArrayList<TreeNode>();
//      TreeNode root = new TreeNode(1);
//      treeArr.add(root);
        int index = 0;
        for(int i=1;i<=comput_num+router_num;i++){
            treeArr.add(new TreeNode(i));
        }
        TreeNode root = treeArr.get(0);
        for(TreeNode t:treeArr){
            if(t.getNum() == 1)
                continue;

            int temp = s.nextInt();
            TreeNode t_temp = getNodeByIndex(temp,treeArr);
            t_temp.addChild(t);
        }

        return treeArr;
    }

    public int getSingle(ArrayList<TreeNode> treeArr){
        HashMap<String,Integer> ha = new HashMap<String,Integer>();
        for(TreeNode t:treeArr){
                Integer key = t.getLevel();
                Integer time = ha.get(Integer.toString(key));
                if(time == null){
                    ha.put(Integer.toString(key),1);
                }else{
                    ha.put(Integer.toString(key), ++time);
                }
        }
        int res = 0;
        Iterator<Entry<String,Integer>> itEntry = ha.entrySet().iterator();
        while(itEntry.hasNext()){
            if(itEntry.next().getValue() == 1)
                res++;
        }

        int level_max = treeArr.get(0).getLevel();
        TreeNode temp = treeArr.get(0);
        for(TreeNode t:treeArr){
            if(level_max<t.getLevel()){
                level_max = t.getLevel();
                temp = t;
            }
        }

        if(ha.get(Integer.toString(level_max)) == 1)
            res--;

        return res;
    }

    public int[] getLastLevel(ArrayList<TreeNode> treeArr){
        int level_max = treeArr.get(0).getLevel();
        TreeNode temp = treeArr.get(0);
        for(TreeNode t:treeArr){
            if(level_max<t.getLevel()){
                level_max = t.getLevel();
                temp = t;
            }
        }
        treeArr.remove(temp);

        int level_sec = treeArr.get(0).getLevel();
        TreeNode temp_sec = treeArr.get(0);
        for(TreeNode t:treeArr){
            if(level_sec<t.getLevel()){
                level_sec = t.getLevel();
                temp_sec = t;
            }
        }
        return new int[]{level_max,level_sec};
    }

    private TreeNode getNodeByIndex(int index,ArrayList<TreeNode> treeArr){
        for(TreeNode t:treeArr){
            if(t.getNum() == index)
                return t;
        }
        return null;
    }

    class TreeNode{
        private ArrayList<TreeNode> childNode;
        private int num;
        private int level;

        public TreeNode(int num){
            this.num = num;
            this.level = 1;
            childNode = new ArrayList<TreeNode>(0);
        }
        public TreeNode(){
            this.num = 0;
            childNode = new ArrayList<TreeNode>(0);
        }

        public ArrayList<TreeNode> getChildArr(){
            return this.childNode;
        }
        public int getNum(){return this.num;}

        public void addChild(TreeNode child){
            this.childNode.add(child);
            child.setLevel(this.level+1);
        }
        public void setNum(int num){
            this.num = num;
        }
        public int getLevel(){return this.level;}
        public void setLevel(int level){this.level = level;}
    }
}

第五題是一個無向圖的最短路徑(需要額外考慮題目中的設定,所以比單純的圖的最短路徑要難一些,沒做出來)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章