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;}
}
}
第五題是一個無向圖的最短路徑(需要額外考慮題目中的設定,所以比單純的圖的最短路徑要難一些,沒做出來)。