题目搜集于各位前辈,侵删。
第一题
奇偶求和
题目描述:
给定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;
}
}
}