区间K大数查询
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定一个序列,每次询问序列中第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.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//序列长度
int n = scanner.nextInt();
int []a = new int[n+1];
for (int i=0;i<n;i++){
//给定的序列
a[i]=scanner.nextInt();
}
//查询个数
int m = scanner.nextInt();
int []result = new int[m];
for (int i=0;i<m;i++){
int l = scanner.nextInt();
int r = scanner.nextInt();
int k = scanner.nextInt();
ArrayList newa = new ArrayList();
for (int j=l-1;j<r;j++){
newa.add(a[j]);
}
Collections.sort(newa);
result[i]= (int) newa.get(newa.size()-k);
}
for (int i=0;i<result.length;i++){
System.out.println(result[i]);
}
}
}
解题思路:数组result用于存放最终结果,用 Collections.sort将ArrayList数组进行排序
寻找数组中最大值
资源限制
内存限制
512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
对于给定整数数组a[],寻找其中最大值,并返回下标。
输入格式
整数数组a[],数组元素个数小于1等于100。输出数据分作两行:第一行只有一个数,表示数组元素个数;第二行为数组的各个元素。
输出格式
输出最大值,及其下标
样例输入
3
3 2 1
样例输出
3 0
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
// 对于给定整数数组a[],寻找其中最大值,并返回下标。
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = scanner.nextInt();
}
int max = a[0], mun = 0;
for (int i = 1; i < a.length; i++) {
if (max < a[i]) {
max = a[i];
mun = i;
}
}
System.out.println(max + " " + mun);
}
}
矩阵乘法
资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
输入两个矩阵,分别是m*s,s*n大小。输出两个矩阵相乘的结果。
输入格式
第一行,空格隔开的三个正整数m,s,n(均不超过200)。
接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j)。
接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j)。
输出格式
m行,每行n个空格隔开的整数,输出相乘後的矩阵C(i,j)的值。
样例输入
2 3 2
1 0 -1
1 1 -3
0 3
1 2
3 1
样例输出
-3 2
-8 2
提示
矩阵C应该是m行n列,其中C(i,j)等于矩阵A第i行行向量与矩阵B第j列列向量的内积。
例如样例中C(1,1)=(1,0,-1)*(0,1,3) = 1 * 0 +0*1+(-1)*3=-3
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int s = scanner.nextInt();
int n = scanner.nextInt();
int [][]result = new int[m][n];
int [][]a = new int[m][s];
int [][]b = new int[s][n];
for (int i=0;i<m;i++){
for (int j=0;j<s;j++){
a[i][j]=scanner.nextInt();
}
}
//b矩阵
for (int i=0;i<s;i++){
for (int j=0;j<n;j++){
b[i][j]=scanner.nextInt();
}
}
for (int i=0;i<m;i++){
int sum=0;
for (int l=0;l<n;l++){
for (int p=0;p<s;p++){
sum =sum + a[i][p]*b[p][l];
}
result[i][l]=sum;
sum=0;
}
}
for (int i=0;i<m;i++){
for (int j=0;j<n;j++){
System.out.print(result[i][j]+" ");
}
System.out.println();
}
}
}
Anagrams问题
资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
输入格式:输入有两行,分别为两个单词。
输出格式:输出只有一个字母Y或N,分别表示Yes和No。
输入输出样例
样例输入
Unclear
Nuclear
样例输出
Y
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str1 = scanner.nextLine().toLowerCase();
String str2 = scanner.nextLine().toLowerCase();
if (str1.length()!=str2.length()){
System.out.println("N");
}else{
char s1[]=str1.toCharArray();
char s2[]=str2.toCharArray();
Arrays.sort(s1);
Arrays.sort(s2);
int result=0;
for (int i=0;i<s1.length;i++){
if (s1[i]!=s2[i]){
result++;
}
}
if (result!=0){
System.out.println("N");
}else{
System.out.println("Y");
}
}
}
}
解题思路:先将字符串的长度进行判断,如果长度不一样可直接输出结果,减少了复杂度,如果字符串长度一样,则将字符存在数组中,将数组进行排序,再比对数组对应位置的字符是否一样,最后将结果进行输出。
2的次幂表示
资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
用递归实现会比较简单,可以一边递归一边输出
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n =scanner.nextInt();
digui(n);
}
public static void digui(int n){
int a=0;
String s =Integer.toBinaryString(n);
int[] arr=new int[s.length()];
for(int i=0;i<s.length();i++) {
if (s.charAt(i)=='1') {
arr[a]=s.length()-(i+1);
a++;
}
}
for(int i=0;i<a;i++) {
if(arr[i]==0) {
System.out.print("2(0)");
}else if(arr[i]==1) {
System.out.print("2");
}else if(arr[i]==2) {
System.out.print("2(2)");
}else if(arr[i]>2) {
System.out.print("2(");
digui(arr[i]);
System.out.print(")");
}
if(i!=a-1) {
System.out.print("+");
}
}
}
}