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);  
	 }  
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值