时间转换
题目描述
给定一个以秒为单位的时间t,要求用 “< H> :< M> :< S> ”的格式来表示这个时间。< H> 表示时间,< M> 表示分钟, 而< S> 表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。
输入
输入只有一行,是一个整数t(0< =t< =86399)。
输出
输出只有一行,是以“< H> :< M> :< S> ”的格式所表示的时间,不包括引号。
样例输入
5436
样例输出
1:30:36
import java.util.Scanner;
//时间转换
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int t=scan.nextInt();
int H,M,S;
H=t/3600;
M=(t%3600)/60;
S=(t%3600)%60;
System.out.print(H+":"+M+":"+S);
}
}
字符串对比
题目描述
给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
1:两个字符串长度不等。比如 Beijing 和 Hebei
2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入
包括两行,每行都是一个字符串
输出
仅有一个数字,表明这两个字符串的关系编号
样例输入
BEIjing
beiJing
样例输出
3
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
String str1=scan.next();
String str2=scan.next();
int len1=str1.length();
int len2=str2.length();
if(len1==len2) {
if(str1.equals(str2)) {
System.out.print("2");
}
else if(str1.equalsIgnoreCase(str2)) {
System.out.print("3");
}
else
System.out.print("4");
}
else
System.out.print("1");
}
}
矩阵乘法
题目描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入
第一行是一个正整数N、M(1< =N< =30, 0< =M< =5),表示矩阵A的阶数和要求的幂数;
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值。
输出
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开。
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
import java.util.Scanner;
//矩阵乘法
public class Main {
public static void main(String []args) {
Scanner scan=new Scanner(System.in);
int n,m;
n=scan.nextInt();//n阶矩阵
m=scan.nextInt();//m次幂
int num[][]=new int[n][n];
//输入矩阵元素
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
num[i][j]=scan.nextInt();
}
}
if(m==0) {//0次幂的结果就是单位矩阵
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(i==j)
System.out.print(1+" ");
else
System.out.print(0+" ");
}
System.out.println();
}
}
else if(m==1) {//1次幂的结果就是矩阵本身
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
System.out.print(num[i][j]+" ");
}
System.out.println();
}
}
else {
int s[][]=new int [n][n];
//用来保留最初的原数组
s=num;
for(int i=1;i<m;i++) {
int result[][]=new int[n][n];//用来保存每次计算的结果
for(int j=0;j<n;j++) {
for(int k=0;k<n;k++) {
int tmp=0;
for(int x=0;x<n;x++) {
tmp+=num[j][x]*s[x][k];
}
result[j][k]=tmp;
}
}
//每次计算的结果都赋值给原数组num
num=result;
}
//最后输出计算后的结果
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
System.out.print(num[i][j] + " ");
}
System.out.println();
}
}
}
}
矩形面积交
题目描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
import java.util.Scanner;
//平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
double p[]=new double[4];
double q[]=new double[4];
for(int i=0;i<4;i++) {
p[i]=scan.nextDouble(); //第一个矩形的两个点坐标
}
for(int j=0;j<4;j++) {
q[j]=scan.nextDouble(); //第二个矩形的两个点坐标
}
double a=Math.min(p[0], p[2]);//下顶点的x坐标
double b=Math.min(p[1], p[3]);//下顶点的y坐标
double c=Math.max(p[0],p[2]);//上顶点的x坐标
double d=Math.max(p[1], p[3]);//上顶点的y坐标
double e=Math.min(q[0], q[2]);//下顶点的x坐标
double f=Math.min(q[1], q[3]);//下顶点的y坐标
double g=Math.max(q[0],q[2]);//上顶点的x坐标
double h=Math.max(q[1], q[3]);//上顶点的y坐标
double s;
double W=0;//相交的部分的矩形的宽
double H=0;//相交的部分的矩形的高
if(e<=c&&e>=a) {
if(g>c)
W=c-e;
else if(g<=c)
W=g-e;
}
else if(e<a) {
if(g>=a&&g<=c)
W=g-a;
else if(g<a)
W=0;
else if(g>c)
W=c-a;
}
else if(e>c)
W=0;
if(f<=d&&f>=b) {
if(h>d)
H=d-f;
else if(h<=d)
H=h-f;
}
else if(f<b) {
if(h>=b&&h<=d)
H=h-b;
else if(h>d)
H=d-b;
else if(h<b)
H=0;
}
else if(f>d)
H=0;
s=W*H;
System.out.print(String.format("%.2f", s));
}
}
区间k大数查询
问题描述
给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
输入格式
第一行包含一个数n,表示序列长度。
第二行包含n个正整数,表示给定的序列。
第三个包含一个正整数m,表示询问个数。
接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。
输出格式
总共输出m行,每行一个数,表示询问的答案。
样例输入
5
1 2 3 4 5
2
1 5 2
2 3 2
样例输出
4
2
数据规模与约定
对于30%的数据,n,m<=100;
对于100%的数据,n,m<=1000;
保证k<=(r-l+1),序列中的数<=106。
import java.util.Scanner;
//给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt(); //序列长度
int num[]=new int[n]; //给定的序列
for(int i=0;i<n;i++)
num[i]=scan.nextInt();
int m=scan.nextInt(); //询问个数
int ask[][]=new int[m][3];
for(int j=0;j<m;j++) {
for(int k=0;k<3;k++) {
ask[j][k]=scan.nextInt();
}
}
for(int j=0;j<m;j++) {
int a=ask[j][0];//起始位置
int b=ask[j][1];//结束位置
int c=b-a+1;//这段中间的长度
int d=ask[j][2];//第d大数
int number[]=new int[c];
for(int p=0,q=a-1;p<c;p++,q++) {
number[p]=num[q];
}
int result=range(number,d);
System.out.println(result);
}
}
private static int range(int[] number, int d) {
int n=number.length;
for(int j=0;j<n;j++) {
for(int k=0;k<n-1;k++) {
if(number[k]<number[k+1]) {
int x=number[k];
number[k]=number[k+1];
number[k+1]=x;
}
}
}
return number[d-1];
}
}