1. 程式人生 > >2013 藍橋杯校內選拔賽 java本科B組(題目+答案)

2013 藍橋杯校內選拔賽 java本科B組(題目+答案)

一、標題:正則表示

    正則表示式表示了串的某種規則或規律。恰當地使用正則表示式,可以使得程式碼簡潔、事半功倍。java的很多API都支援正則表示式作為引數。其中的String.split就是這樣。

    看下面的程式碼,其意圖為把一個或多個空格或逗號、句號分開的單詞分離出來。即獲得陣列為:
    
    ["cat","doc","desk","push","last","this","is","what","must","be"]
    
    請在劃線處填入適當程式碼,取得要求的效果。

    String s = "cat dog,desk push last,   this is what.   must be";

    String[] ss = s.split("______________________________");   //填空位置

    for(String k: ss) System.out.println(k);


請嚴格按照格式,通過瀏覽器提交答案。

注意:只提交劃線部分缺少的內容,不要寫其它附加內容,比如:說明性的文字或已經存在的程式碼。

/**
 * 正則表示式,\s表示空白字元,|表示或,*表示0個或多個,+表示一個或多個。
 * @author DaiSong
 * @Date 2013年12月1日
 */
public class Regex {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s = "cat dog,desk push last,   this is what.  must be";
		String[] ss = s.split("\\s*\\,\\s*|\\s*\\.\\s*|\\s+");   //填空位置
		for(String k: ss) 
			System.out.println(k);
	}

}
二、題目標題: 堆煤球

    小明的爺爺很懷舊,冬天來了他還是要自己做煤球。

    並且,爺爺把煤球堆放得十分整齊有規律:最上邊一層只有1個煤球。第二層4個煤球擺成正方形,再下面9個煤球也是擺成正方形。總之,第 n 層就是邊長為 n 的正方形。這樣的結構既通風又穩固。

    小明數了數,一共有30層,請你幫助計算一下,一共有多少個煤球? ___________

請通過瀏覽器提交答案。
注意:只提交數字,不要求解過程或公式。
注意:不要書寫其它的內容(比如:說明性的文字)。
/**
 * 堆煤球,1~30的平方求和
 * @author DaiSong
 * @Date 2013年12月1日
 */
public class PutBriquettes {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int sum=0;
		for(int i=1;i<=30;i++){
			sum+=(i*i);
		}
		System.out.println(sum);
	}
}

三、題目標題: 大小之差

    某6位數,只包含1~9中的某些數字(可以重複包含同一數字,但不含數字0)。
    該數字重新排列數位後,可以得到最大數和最小數。最大最小之差也是6位數,並且它恰好包含了組成原6位數同樣的數字。

    比如:766431 - 134667 = 631764 就是具有這樣特徵的數字。
    
    你還能找到另一個這樣的6位數嗎?
    
    請填寫它重新排列數位後的得到的最大數:________________  


請通過瀏覽器提交答案。
注意:只提交另一個6位數,題中已經給出的這個不要提交。
注意:不要書寫其它的內容(比如:說明性的文字)。
import java.util.ArrayList;
/**
 * 大小之差,字串操作加上陣列排序。
 * @author DaiSong
 * @Date 2013年12月1日
 */
public class TheSizeDifference {
	
	static int[] a=new int[6];
	static int[] b=new int[6];
	
	static ArrayList<String> al=new ArrayList<String>();
	public static String BubSort(int a[]) {
		boolean flag = true;
		for (int i = 0; i < a.length && flag; i++) {
			flag = false;
			for (int j = a.length - 1; j > i; j--) {
				if (a[j] < a[j - 1]) {
					swap(a, j, j - 1);
					flag = true;
				}
			}
		}
		String s="";
		for(int i=0;i<6;i++){
			s+=a[i];
		}
		return s;
	}
	
	public static void swap(int[] arr,int i,int j){
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
	}
	
	public static void function(int n){
		String t1,t2,t3,t4;
		String s=""+n;
		if(s.indexOf("0") != -1)
			return;
		for(int j=0;j<6;j++){
			a[j]=s.charAt(j)-48;
		}
		t1=BubSort(a);
		StringBuffer sb=new StringBuffer(t1);
		t2=sb.reverse().toString();
		t3=(Integer.parseInt(t2)-Integer.parseInt(t1))+"";
		if(t3.length()!=6)
			return;
		for(int j=0;j<6;j++){
			b[j]=t3.charAt(j)-48;
		}
		t4=BubSort(b);
		
		if(t1.equals(t4)){
			if(!al.contains(t3)){
				al.add(t3);
				System.out.println(t2+"-"+t1+"="+t3);
			}else {
				return;
			}
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=111111;i<=999999;i++){
			function(i);
		}
	}
}
四、標題:迴文數字

    觀察數字:12321,123321 都有一個共同的特徵,無論從左到右讀還是從右向左讀,都是相同的。這樣的數字叫做:迴文數字。

    本題要求你找到一些5位或6位的十進位制數字。滿足如下要求:
    該數字的各個數位之和等於輸入的整數。


【輸入格式】
一個正整數 n (10<n<100), 表示要求滿足的數位和。

【輸出格式】
若干行,每行包含一個滿足要求的5位或6位整數。
數字按從小到大的順序排列。
如果沒有滿足條件的,輸出:-1

【樣例輸入】
44

【樣例輸出】
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499

【樣例輸入2】
60

【樣例輸出2】
-1

【資源約定】
    峰值記憶體消耗 < 64M
    CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。

 
import java.util.Scanner;
/**
 * 迴文數字
 * @author DaiSong
 * @Date 2013年12月1日
 */
public class PalindromeFigures {
	
	public static int count(String s){
		int sum=0;
		for(int i=0;i<s.length();i++){
			sum+=(s.charAt(i)-48);
		}
		return sum;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		String s;
		for(int i=10000;i<=999999;i++){
			s=""+i;
			StringBuffer sb=new StringBuffer(s); 
			if(s.equals(sb.reverse().toString()) && count(s)==n){
				System.out.println(s);
			}
		}
	}
}

五、標題:最大子陣

    給定一個n*m的矩陣A,求A中的一個非空子矩陣,使這個子矩陣中的元素和最大。
    其中,A的子矩陣指在A中行和列均連續的一塊。

【輸入格式】
    輸入的第一行包含兩個整數n, m,分別表示矩陣A的行數和列數。
    接下來n行,每行m個整數,表示矩陣A。

【輸出格式】
    輸出一行,包含一個整數,表示A中最大的子矩陣中的元素個數。

【樣例輸入】
3 3
-1 -4 3
3 4 -1
-5 -2 8

【樣例輸出】
10

【樣例說明】
取最後一列,和為10。

【資料規模與約定】
對於50%的資料,1<=n, m<=50;
對於100%的資料,1<=n, m<=500,A中每個元素的絕對值不超過5000。


【資源約定】
    峰值記憶體消耗 < 64M
    CPU消耗  < 3000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。
 
import java.util.Scanner;
/**
 * 最大子陣,壓縮矩陣為一維陣列,轉化為求最大欄位和問題,運用動態規劃求解。
 * @author DaiSong
 * @Date 2013年12月1日
 */
public class MaximumSubmatrix {
	 
	 static int MAX=500;
	 static int[][] a =new int [MAX][MAX];
	 static int  n,m;  
	 
	 public static int MaxSum(int[] a,int n){
			int start,all;
			start=all=a[0];
			for(int i=1;i<n;i++){
				start=Math.max(a[i], a[i]+start);
				all=Math.max(start,all);
			}
			return all;
		}
	 public static void main(String[] args) {
		 Scanner cin=new Scanner(System.in);
	     int i, j, k, Max, minMax;  
	     n=cin.nextInt();
	     m=cin.nextInt();
	     for (i=0; i<n; i++)  {  
	         for (j=0; j<m; j++){  
	             a[i][j]=cin.nextInt();
	         }  
	     }  
	     
	     Max = Integer.MIN_VALUE;  
	     for (i=0; i<n; i++){  
	         minMax = MaxSum(a[i], m);  
	         if (minMax > Max)
	        	 Max = minMax;  
	         for (j=i+1; j<n; j++){  
	             for (k=0; k<n; k++){  
	                 a[i][k] += a[j][k];  
	             }  
	             minMax = MaxSum(a[i], n);  
	             if (minMax > Max)
	            	 Max = minMax;  
	         }  
	     }  
	     System.out.print(Max);  
	 }  
}