区间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("+");
            }
        }
    }
}
最后修改:2023 年 01 月 29 日
如果觉得我的文章对你有用,请随意赞赏