计挑赛初赛试题(2020)(一)

题目描述:

有一组均由字符A~Z和a~z组成的字符串,其中要求将字符串中各字符按如下要求进行转换:

A<->z、B<->y、C<->x、...... 、X<->c、Y<->b、Z<->a。

输入样例:Algorithm

输出样例:zOTLIRGSN

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s=sc.next();
		String[] s1=s.split("");
		String res="";
		for (int i = 0; i < s1.length; i++) {
			//字母转数字:先将字母通过.charAt(0)转为char型,再将char强转为数字
			//数字转字母:将数字强转为char,然后加入字符串。
			char c = s1[i].charAt(0);
			int a=(int)c;
			if ((a>=65&&a<=90)||(a>=97&&a<=122)) {
				int b=187-a;
				res+=(char)b;
			}
		}
		System.out.println(res);
	}
}

题目描述

小明今天收了N个鸡蛋,每个鸡蛋各有重量,现在小明想找M个重量差距最小的鸡蛋摆成一盒出售,输出符合条件的最重一盒鸡蛋的总重量.

输入说明

第一行,用空格分隔的2个整数,分别表示鸡蛋个数N(N<1000)和每盒个数M(M<N);

第二行,N个鸡蛋重量(浮点)。

输出说明

1行,符合条件的最重一盒鸡蛋的总重量(保留2位小数)

输入样例

8 4

11 9 12 5 10 19 8 6

输出样例

42.00

 解题思路:

1 把输入进来的鸡蛋重量存到一个ArrayList当中,先对这个列表进行升序排序
2 从列表第一个元素开始,后面M个元素划为一组,计算它们的重量的差值和总的重量的和。
3 判断当前的差值是否小于或者等于之前的最小差值,如果小于等于,则替换之前的最小差值和重量和
4 元素指针向后移动一位,反复重复上面过程,
求出拥有最小差值的最大重量和

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        ArrayList<Double> ans = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            ans.add(sc.nextDouble());
        }
        //对集合进行升序排序,这样不用考虑最重的问题
        Collections.sort(ans);
        //最大和设为最小
        double maxSum = ans.get(0);
        //最小差值设为最大
        double minDifferValue = ans.get(ans.size() - 1);
        //防止越界,最后一组是(n-m-1,n-1)
        for (int i = 0; i < N - M; i++) {
            double sum = 0;
            //计算每组的差值--尾元素减去首元素,如果说这组的尾元素减去首元素最小,那么证明该组中每个数的间隔最小
            double differValue = ans.get(i + M - 1) - ans.get(i);
            //计算每组的和
            for (int j = 0; j < M; j++) {
                sum += ans.get(j + i);
            }
            //判断是否还有差值更小的
            if (differValue <= minDifferValue) {
                maxSum = sum;
                minDifferValue = differValue;
            }
        }
        System.out.println(String.format("%.2f", maxSum));
    }
}

题目描述

统计从1到N的整数中,所有立方值的平方根为整数的数的个数。

输入样例

10

输出样例

3

(说明:样例中符合条件的3个数是1、4、9)

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n=scanner.nextInt();
		int sum = 0;
		for (int i = 1; i <=n; i++) {
			//一个数的3次方,开根如果是一个整数,说明它的1.5次方也一定是整数
			double temp = Math.pow(i,1.5);
			//把一个数的1.5次方强转为整数判断是否相等
            if(temp==(int)temp){
                sum++;
            }
		}
		System.out.println(sum);
		/**
		 * 判断一个数开根是否为整数也可以这样
		 * floor为向下取整(3.7->3.0),一个数字开方后加上0.5后向下取整,
		 * 如果等于其开方后的自己就说明自己的开方数字为整数
		 * boolean b=Math.floor(Math.sqrt(i)+0.5)!=Math.sqrt(i);
		 */
	}
} 

题目描述

统计1到N的整数中,除了1和自身之外,至少还能被两个数整除的数的个数

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int res=0;
		for(int i=6;i<=n;i++) {
			int count=0;
			for(int j = 2; j <i; j++) {
				if (i%j==0) {
					count++;
					if (count>=2) {
						res++;
						break;
					}
				}
			}
		}
		System.out.println(res);
	}
}
    /**
     * 附:判断一个数是否为质数
     */
	public boolean isPrime(int x) {
        for (int i = 2; i * i <= x; ++i) {
            if (x % i == 0) {
                return false;
            }
        }
        return true;
    }

题目描述

Excel表列名称由字母A~Z组成,列字母的规律如下:A、B、C.....Z、AA、AB......AZ、BA、BB.......ZZZZY、ZZZZZ.......,现在请你计算2列之间含有多少列单元格。

输入样例

AA AZ

输出样例

24

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s1=sc.next();
		String s2 = sc.next();
		char[] c1=s1.toCharArray();
		char[] c2 = s2.toCharArray();
		int sum=0;
		int sum1=0;
		//得到每一组字符串对应的值
		//因为它是26进制的,从后向前每取一位就乘以26
		for (int i = c1.length-1,j=1; i >=0; i--,j=j*26) {
			sum += (c1[i]-'A'+1)*j;
		}
		for (int i = c2.length-1,j=1; i >=0; i--,j=j*26) {
			sum1 += (c2[i]-'A'+1)*j;
		}
		int res=sum>sum1 ? sum-sum1 :sum1-sum;
		System.out.println(res-1);
	}
}

题目描述:

由N(N<=10000)个整数组成的数组,其中连续K(K<=200)个元素构成一个区间,称为K区间。一个K区间中所有素数的和记为Sk,请计算整个数组中,所有K区间中的最大Sk值,并输出。

输入说明:第一行是两个整数N和K,第二行输入N个数,表示数组中的元素。
输出说明:最大Sk值
输入样例:8 2
12 23 27 34 19 17 45 8
输出样例:36

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		int[] arr=new int[n];
		int max=0;
		for (int i = 0; i < n; i++) {
			arr[i] = sc.nextInt();
		}
		for (int i = 0; i < n; i+=m) {
			int sum=0;
			for (int j = 0; j < m; j++) {
				if (judge(arr[j+i])) {
					sum+=arr[j+i];
				}
			}
			max=Math.max(max, sum);
		}
		System.out.println(max);
	}
	public static boolean judge(int n) {
		for (int i = 2; i < n; i++) {
			if (n%i==0) {
				return false;
			}
		}
		return true;
	}
}

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1while(true){learn}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值