BUPT2014软院机试Java题解

题目搜集于各位前辈,侵删。

第一题

奇偶求和
题目描述:

给定N个数,分别求出这N个数中奇数的和以及偶数的和。

输入格式

第一行为测试数据的组数T(1<=T<=50)。请注意,任意两组测试数据之间是相互独立的。
每组数据包含两行:
第一行为一个整数N(1<=N<=10C)。
第二行为N个正整数,整数之间用一个空格隔开,且每个整数的绝对值均大不于10^5。

输出格式:

每组数据输出两个数,即N个数中奇数之和和偶数之和,中间用空格隔开。

输入样例

2
5
1 2 3 4 5
5
1 1 1 1 1

输出样例

9 6
5 0

import java.util.Scanner;

public class s1401 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int t=0;t<T;t++) {
			int n = sc.nextInt();
			int odd = 0;
			int even = 0;
			for(int i = 0;i<n;i++) {
				int a = sc.nextInt();
				if(a%2==0) {
					even+=a;
				}else {
					odd+=a;
				}
			}
			System.out.println(odd+" "+even);
		}
		sc.close();
	}

}

第二题

最长连续等差子数列
题目描述

给定一个长度为N的整数数列,你需要在其中找到最长的连续子数列的长度,并满足这个子序列是等差的。
注意公差小于或等于0的情况也是允许的。

输入格式

第一行为数据组数T(1<=T<=100),表示测试数据的组数。
对于每行测试数据:
第一行是一个正整数N(1<=N<=100),表示给定数列的长度。
第二行是N个整数,其中第i个整数valuei(1<=valuei<=10^5)表示下标为i的数字。

输出格式

对于每组测试数据,输出最长的连续等差子数列的长度。

输入样例

2
2
1 3
5
1 6 4 2 4

输出样例

2
3

样例解释

两组样例的最长连续等差子数列分别是{1,3}和{6,4,2}

import java.util.Scanner;

public class s1402 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int t=0;t<T;t++) {
			int n = sc.nextInt();
			int max = 0;
			int sum = 1;
			int d = 0;
			int pre = -1;
			for(int i =0;i<n;i++) {
				int a = sc.nextInt();
				if(i>0) {
					if(a-pre == d) {
						sum++;
						pre = a;
					}else {
						sum = 2;
						d = a-pre;
						pre = a;
					}
					if(sum>max) {
						max = sum;
					}
				}
			}
			System.out.println(max);
		}
		sc.close();
	}

}

第三题

最近公共祖先
题目描述

给出一棵有N个节点的有根树TREE(根的编号为1),对于每组查询,请输出树上节点u和v的最近公共祖先。
最近公共祖先:对于有向树TREE的两个结点u,v。最近公共祖先LCA(TREE u,v)表示一个节点x,满足x是u、v的祖先且x的深度尽可能大。

输入格式

输入数据第一行是一个整数T(1<=T<=100),表示测试数据的组数。
对于每组测试数据:
第一行是一个正整数N(1<=N<=100),表示树上有N个节点。
接下来N-1行,每行两个整数u,v(1<=u,v<=N),表示节点u是v的父节点。
接下来一行是一个整数M(1<=M<=1000),表示查询的数量。
接下来M行,每行两个整数u,v(11<=u,v<=N),表示查询节点u和节点v的最近公共祖先。

输出格式

对于每个查询,输出一个整数,表示最近公共祖先的编号,

输入样例

2
3
1 2
1 3
1
2 3
4
1 2
1 3
3 4
2
2 3
3 4

输出样例

1
1
3

import java.util.Arrays;
import java.util.Scanner;

public class s1403 {

	static int[] parent;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int t=0;t<T;t++) {
			int n = sc.nextInt();
			parent = new int[n+1];
			Arrays.fill(parent, -1);
			for(int i = 0;i<n-1;i++) {
				int father = sc.nextInt();
				int son = sc.nextInt();
				parent[son] = father;
			}
			int m = sc.nextInt();
			for(int i = 0;i<m;i++) {
				int p1 = sc.nextInt();
				int p2 = sc.nextInt();
				int both = 0;
				while(true) {
					int d1 = depth(p1);
					int d2 = depth(p2);
					if(d1 == d2) {
						if(p1 == p2) {
							both = p1;
							break;
						}else if(parent[p1] == parent[p2]) {
							both = parent[p1];
							break;
						}else {
							p1 = parent[p1];
							p2 = parent[p2];
						}
					}else if(d1>d2) {
						p1 = parent[p1];
					}else {
						p2 = parent[p2];
					}
				}
				System.out.println(both);
			}
		}
		sc.close();
	}

	static int depth(int a) {
		int depth = 1;
		while(parent[a]!=-1) {
			a = parent[a];
			depth++;
		}
		return depth;
	}
}

第四题

数据库检索
题目描述

在数据库的操作过程中,我们进场会遇到检索操作。这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果。
我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex)以及出生日期(Birthday)。其中,Name项是长度不超过30的字符串,只可能包含大小写字母,没有空格;Sex项进可能为‘Male’或者‘Female’(不含引号);Birthday项以yyy/mm/dd的格式存储,如:1990/01/01,
1991/12/31,等等。
每个查询所可能包含的条件如下:
Name=‘REQUIRED_NAME’,查询姓名为REQUIRED_NAME的学生,其中REQUIRED_NAME为长度在1到30之间的字符串;
Sex=‘Male’或Sex=‘Female’,查询性别为男/女的学生;
Birthday=‘yyy/mm/dd’,查询出生年/月/日为特定值的学生。如果其中某项为’’,则说明该项不受限制。例如,‘1990/06/’表示1990年6月出生,‘/03/’表示出生月份为3月。
给定数据库的所有表项以及若干条查询,你需要对每条查询输出它返回的结果。

输入格式

输入包含多组测试数据。输入的第一行为测试数据的组数T(1<=T<=50)。
对于每组测试数据,第一行是两个整数N和M(N,M<=500),分别表示数据的数量以及查询的数量。
接下来N行,每行以Name Sex Birthday的形式给出每个学生的信息。
没下来M行,每行给出若干条限制条件,以空格隔开。条件以Name Sex Birthday的顺序给出(如果存在),且每种限制条件最多只出现一次。

输出格式

对于每条查询,按照输入的顺序输出符合条件的学生姓名,每个一行。如果没有符合查询的信息,则输出一行NULL。

样例输入

1
5 6
Michael Male 1990/02/28
Amy Female 1992/04/03
Tom Male 1991/12/15
Lynn Female 1991/04/09
Zheng Male 1990/04/20
Name=’Amy’
Name=’Betty’
Sex=’Female’ Birthday=’/04/09’
Sex=’Female’ Birthday=’
//
Name=’Michael’ Sex=’Female’
Name=’Michael’ Sex=’Male’ Birthday=’1990/02/*’

csdn的*格式改变,贴出原输入
在这里插入图片描述

样例输出

Amy
NULL
Lynn
Amy
Lynn
NULL
Michael

import java.util.Scanner;

public class s1404 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T = Integer.parseInt(sc.nextLine());
		for(int t=0;t<T;t++) {
			String[] nm = sc.nextLine().split(" ");
			int n = Integer.parseInt(nm[0]);
			int m = Integer.parseInt(nm[1]);
			People[] people = new People[n];
			for(int i = 0;i<n;i++) {
				String[] infor = sc.nextLine().split(" ");
				String name = infor[0];
				String sex = infor[1];
				String birthday = infor[2];
				String[] s = birthday.split("/");
				String year = s[0];
				String month = s[1];
				String day = s[2];
				People p = new People(name,sex,birthday,year,month,day);
				people[i] = p;
			}
			for(int i = 0;i<m;i++) {
				String s = sc.nextLine();
				String[] op = s.split(" ");
				String name = null;
				String sex = null;
				String year = null;
				String month = null;
				String day = null;
				for(int j = 0;j<op.length;j++) {
					if(op[j].charAt(0)=='N') {
						name = op[j].substring(6,op[j].length()-1);
					}else if(op[j].charAt(0)=='S') {
						sex = op[j].substring(5,op[j].length()-1);
					}else {
						String birthday = op[j].substring(10,op[j].length()-1);
						String[] split = birthday.split("/");
						if(!split[0].equals("*")) {
							year = split[0];
						}
						if(!split[1].equals("*")) {
							month = split[1];
						}
						if(!split[2].equals("*")) {
							day = split[2];
						}
					}
				}
				//System.out.println("name:"+name+" sex:"+sex+" year:"+year+" month:"+month+" day:"+day);
				int flag = 0;
				for(int k = 0;k<n;k++) {
					if((people[k].name.equals(name)||name==null)&&(people[k].sex.equals(sex)||sex==null)&&(people[k].year.equals(year)||year==null)&&(people[k].month.equals(month)||month==null)&&(people[k].day.equals(day)||day==null)) {
						System.out.println(people[k].name);
						flag = 1;
					}
				}
				if(flag == 0) {
					System.out.println("NULL");
				}
			}
		}
		sc.close();
	}
	
	static class People{
		String name;
		String sex;
		String birthday;
		String year;
		String month;
		String day;
		public People(String name, String sex, String birthday, String year, String month, String day) {
			super();
			this.name = name;
			this.sex = sex;
			this.birthday = birthday;
			this.year = year;
			this.month = month;
			this.day = day;
		}

		
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值