java 计挑赛

一.2020年能力挑战赛初赛

1-1题目

1-1 统计1到N的整数中,被A除余A-1的偶数的个数
输入说明:整数 N(N<10000), A, (A<N)
输出说明:符合条件的数的个数
输入样例:10 3
输出样例:2
(说明:样例中符合条件的2个数是 2、8)

1.1解题思路

  1. 先使用java.util.Scanner类进行接收输入N,A
  2. 1到N整数的偶数控制可使用for循环for(int i=2;i<N;i+2)
  3. 使用if(i%A==A-1)就将count++
  4. 代码如下:
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
	Scanner input=new Scanner(System.in);
   int N=input.nextInt();//读入整数
   int A=input.nextInt();//读入A
   int count=0;
   for(int i=2;i<=N;i+=2){
		if(i%A==A-1){
			count++;
		}
	}
    System.out.println(count);
  }
}

1-2题目

1-2 统计1到N的整数中,除了1和自身之外,至少还能被两个数整除的数的个数
输入说明:整数 N(N<10000);
输出说明:符合条件的数的个数
输入样例:10
输出样例:3
(说明:样例中符合条件的3个数是6、8、10)

1.1解题思路

  • 质数的定义:质数又叫素数,指的是大于1的自然数,除了1和本身外,不能被其他数整除的数叫质数。或者定义为:大于1的自然数,除了1和本身外不在用于其他因数。
import java.lang.Math;
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
	Scanner input=new Scanner(System.in);
   int N=input.nextInt();
   int count=0;
   for(int i=2;i<=N;i++){
		if(test(i)){
          count++;
        }
   }
    System.out.println(count);
  
  }
  public static boolean test(int n){
    int N=(int)Math.sqrt(n);
    boolean flag=false;
    for(int i=2;i<=N;i++){
      if(n%i==0&&n/i!=i){
			flag=true;
      }
    }
    return flag;
    
  }
}

1-3题目

1-3 统计从1到N的整数中,所有立方值的平方根为整数的数的个数
输入说明:整数 N(N<10000);
输出说明:符合条件的数的个数,如4的3次方=64=8的2次方
输入样例:10
输出样例:3
(说明:样例中符合条件的3个数是1、4、9)
1e-6参考链接

1e-6 :

  • 1e-6表示1乘以10的负6次方。
  • Math.abs(x)<1e-6其实相当于x==0
  • 1e-6(也就是0.000001)叫做epslon,用来抵消浮点运算中因为误差造成的相等无法判断的情况。它通常是一个非常小的数字(具体多小要看你的运算误差)
//方法一:
import java.util.Scanner;
import java.lang.Math;
public class Main{
  public static void main(String[] args) {
     Scanner input = new Scanner(System.in);
     int N = input.nextInt();
     int ans = 0;
     for(int i = 1;i <= N;i++){
       double temp = Math.pow(i,3);
       double temp1=Math.sqrt(temp);
       if(Math.abs(temp1 - (int)temp1) < 1e-6){
             ans++;
            }
      }
     System.out.println(ans);


  }
}
//方法二:
import java.util.Scanner;
import java.lang.Math;
public class Main{
  public static void main(String[] args) {
     Scanner input = new Scanner(System.in);
     int N = input.nextInt();
     int ans = 0;
     for(int i = 1;i <= N;i++){
       double temp = Math.pow(i,3);
       double temp1=Math.sqrt(temp);
       if(temp1==(int)temp1){
             ans++;
            }
      }
     System.out.println(ans);


  }
}

//方法三:
import java.util.Scanner;
import java.lang.Math;
import java.lang.Double;
public class Main{
  public static void main(String[] args) {
     Scanner input = new Scanner(System.in);
     int N = input.nextInt();
     int ans = 0;
     for(int i = 1;i <= N;i++){
       double temp=Math.pow(i,3);
       double temp1=Math.sqrt(temp);
       String string=Double.toString(temp1);
       int index=string.indexOf(".");
       String substring=string.substring(index+1);
       if(substring.equals("0")){
             ans++;
            }
      }
     System.out.println(ans);


  }
}
//方法四:

import java.util.Scanner;
import java.lang.Math;
public class Main{
  public static void main(String[] args) {
     Scanner input = new Scanner(System.in);
     int N = input.nextInt();
     int ans = 0;
     for(int i = 1;i <= N;i++){
      int temp = (int) Math.sqrt(i*i*i);
      int Value = temp*temp ;
      int realValue = i*i*i;
       if(realValue==temp){
             ans++;
            }
      }
     System.out.println(ans);


  }
}

2-1题目

2-1 小明今天收了N个鸡蛋,每个鸡蛋各有重量,现在小明想找M个重量差距最小的鸡蛋摆成一盒出售,输出符合条件的最重一盒鸡蛋的总重量
输入说明:第一行,鸡蛋个数N(N<1000) 每盒个数M(M<N);第二行,N个鸡蛋重量(浮点)
输出说明:符合条件的最重一盒鸡蛋的总重量(保留2位小数)
输入样例:8 4
11 9 12 5 10 19 8 6
输出样例:42.00

import java.util.*;
public class Main{
  public static void main(String args[]){
    Scanner input=new Scanner(System.in);
    int N=input.nextInt();
    int M=input.nextInt();
    ArrayList<Double> weight=new ArrayList<>();
    for(int i=0;i<N;i++){
      weight.add(input.nextDouble());
    }
   Collections.sort(weight,new Comparator<Double>(){
	@Override
     public int compare(Double o1,Double o2){
	if(o1>o2){
            return 1;  
          }else if(o1==o2){
             return 0; 
          }
       	return -1;
     }
   });
   double maxSum=0;
   double  minDifferValue=Double.MAX_VALUE;
   for(int i=0;i<N-M;i++){
     double sum=0;
     double differValue=weight.get(i+M-1)-weight.get(i);
     for(int j=0;j<M;j++){
       sum+=weight.get(j+i);
     }
     if(differValue<= minDifferValue){
       maxSum=sum;
        minDifferValue=differValue;
     }
   }
    System.out.println(maxSum);
    
  }
}

2-3题目

2-3 给出长度为N的各不相同整数组成的数组,求解2个数相加为M的情况个数。
输入说明:
第一行,2个空格分隔的整数,分别表示数组中元素个数N(N<1000) 和值M;
第二行,N个用空格分隔的数组元素(整数)。
输出说明:
一行,一个整数,为相加为M的情况个数。
输入样例:
8 10
1 4 2 5 3 19 8 6
输出样例:
2

import java.util.*;
public class Main{
	public static void main(String args[]){
     Scanner input=new Scanner(System.in);
     int N=input.nextInt();
     int M=input.nextInt();
     int[] array=new int[N];
     int count=0;
     for(int i=0;i<N;i++){
       array[i]=input.nextInt();
     }
     for(int i=0;i<N;i++){
	for(int j=i+1;j<N;j++){
	if((array[i]+array[j])==M){
                  count++;
                }	
        }
       
     }
      System.out.println(count);
    }
  
}

3-1题目

3-1 在一个由小写字母(a-z)组成的字符串中,查找最长子串,其中头尾字符串相同,中间不包含头尾字符,并输出最左边的该类的子串。
输入说明:
1行,为待处理字串(长度<=200)
输出说明:
1行,为满足条件的子串
输入样例:
adfasjdoiasldhlfa
输出样例:
fasjdoiasldhlf

解题思路

1.头尾字母相同
2.中间不含头尾字母
3.符合上述条件中最长的
逐个解决:
1.循环遍历字符串每个字母,查询当前字母的下一个相同字母的位置,即可获取当前字母对应子串的长度
注意:应先处理特殊情况,即当前字母不会再次出现且子串为空。这种情况直接赋予当前字母作为子串初值。
这样遍历结束就可以找出所有符合条件1、2的子串。
2.在遍历中加入对子串长度的判断,记录长度初值为0,若经过特殊处理则长度为1。
在遍历中,如果符合条件的新子串长度大于旧子串的长度,则更新长度和子串。
此处判断使用大于,即长度相等时取用左边的子串。
遍历结束则找出符合条件的最左边的最长子串。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
  public static void main(String args[])throws IOException{
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    String str=stdin.readLine();
    int len=0;
    String out="";
    for(int i=0;i<str.length();i++){
      int nextchar=str.indexOf(str.charAt(i),i+1);
      if(nextchar==-1&&len==0){
        out=out+str.charAt(i);
        len++;
      }else{
        if(nextchar-i>len){
          len=nextchar-i;
          out=str.substring(i,nextchar+1);
        }
      }
    }
    System.out.println(out);
  }
}

3-2题目

3-2 在一个小写英文字母(a-z)中组成的字符串的最短子串,其包含这个字符串的所有出现的字母。输出最左边的该类子串。

输入说明:
一行,为待处理字串(长度<=200);
输出说明:
一行,为满足条件的子串
输入样例:
adfasjdoiasdlfa
输出样例:
fasjdoi

解题思路:

1.包含这个字符串中所有出现的字母
2.符合最左边的最短子串
解题步骤:
1.循环遍历字符串,取出所有出现的字母,储存备用;
2.在循环遍历中加入对子串长度的判断,记录初始化长度为最大值,查找切分所有可能出现的子串,根据1中取出的字母检查子串是否包含所有出现的字母。
检查通过:判断子串长度是否小于记录长度。
小于记录:更新子串以及记录长度。
此处判断长度使用小于,即当长度相等时取用左边的子串。
循环结束即获得符合条件且在最左边的最短子串。

import java.io.*;

public class Main{
  public static void main(String args[]) throws IOException{
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    String all="";
    int len=444;
    String out="";
    String str=stdin.readLine();
    for(int i=0;i<str.length();i++){
      if(all.indexOf(str.charAt(i))==-1){
			all=all+str.charAt(i);
      }
     
    }
     for(int i=0;i<str.length();i++){
        for(int j=i;j<str.length();j++){
          if(check(str.substring(i,j+1),all)){
         	if(j-i<len){
              out=str.substring(i,j+1);
              len=out.length();
            }
          }
        }
      }	
     System.out.println(out); 
  }
  public static boolean check(String str,String all){
    for(int i=0;i<all.length();i++){
		if(str.indexOf(all.charAt(i))==-1){
          return false;
        }
    
    }
    return true;
  }
}

3-3

3-3题目描述:
在一个由小写英文字母(a-z)组成的字符串中,查找最短子串,其头尾字母相同。输出最左边的该类子串。
输入说明:
输入一行,处理待字符串(长度<=200)
输出说明:
输出一行,为满足条件的子串
输入样例:
dfasjdoiasldhlfa
输出样例:
ldhl

import java.io.*;
public class Main{
  public static void main(String args[]) throws IOException{
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    String str=stdin.readLine();
    int len=99900;
    String out="";
    for(int i=0;i<str.length();i++){
      int nextChar=str.indexOf(str.charAt(i),i+1);
      if(nextChar==-1&&len==0){
        out=out+str.charAt(i);
        len++;
      }else{
        if(nextChar>0&&nextChar-i<len){
          len=nextChar-i;
          out=str.substring(i,nextChar+1);
        }
      }
    }
    System.out.println(out);
  }
}

4-1题目

4-1题目描述:
某商品有2种不同数量的包装,对应不同的价格;同时提供满200元减50不限量的购物券,试求解最佳的购买策略,在单次购买中以最低总价购买正好500个。
输入说明:
输入一行,为空格分隔的两个整数,分别表示两种包装的数量和价格(均为整数)
输出说明:
输出一行,为空格分隔的两个整数,分别表示两种商品各自购买包数(无解则输出-1)
数入样例:
100 80 200 150
输出样例:
5 0

4-2题目

4-2 某饮料店有两种奶茶饮料,其中一种每瓶含奶粉15g含茶粉5g,另一种每瓶含奶粉10g含茶粉10g。设某天饮料店消耗的奶粉和茶粉重量分别为x(输入)和y(输入)(单位g)求当天饮料店两种饮料的销量。
输入说明:奶粉和茶粉的消耗量(均为整数)
输出说明:两种饮料各自销量(无解则输出:-1)
输入样例:400 300
输出样例:10 25

import java.util.*;
public class Main{
  public static void main(String args[]){
    Scanner input = new Scanner(System.in);
    int x=input.nextInt();
    int y=input.nextInt();
    
    float X=(x-y)/10;
    float Y=(x-15*X)/10;
    if(X==(int)X&&Y==(int)Y&&X>0&&Y>0){
      System.out.print(X);
      System.out.print(Y);
      input.close();
    }else{
      System.out.print(-1);
    }
    
  }
 
}

二. 模拟题

1 .题目

题目:统计1到N(含)之间的平方数的个数,并输出这个数目
提示:平方数的个数,如4是2的平方数,16是4的平方数,5不是平方数。
输入说明:一个整数N(N<100000);
输出说明:平方数的个数
输入样例:50
输出样例:7

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int N=input.nextInt();
        int count=0;
        for(int i=1;i<=N;i++){
            if(Math.sqrt(i)==(int)(Math.sqrt(i))){
                count++;
            }
        }
        System.out.println(count);
    }
}

2.题目

2.题目:对于给定长度为N<1000正整数数组,满足连续三个元素均为合数的区间成为3合数区间,计算该数组中三合数的个数
输入说明:第一行数组的元素个数,第二行,N个正整数,用空格分隔开
输出说明:3个合数的区间个数
输入案例:7
6 8 4 9 7 5 8
输出案例:2

解题思路:
合数的定义:指大于1的整数,除了能被1和其自身整除外,还能被其他数整除的数。

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
    Scanner input=new Scanner(System.in);
    	int N=input.nextInt();
    	int[] a=new int[N];
    	boolean flag=false;
    	int count=0;
    	for(int i=0;i<N;i++) {
    		a[i]=input.nextInt();
    	}
    	for(int i=0;i<a.length-2;i++) {
    		for(int j=i;j<i+3;j++) {
    			if(isZhiShu(a[j])) {
    				flag=true;
    			}
    		}
    		if(!flag) {
    			count++;
    		}
    		
    	}
    	System.out.println(count);
    	}
    public static boolean isZhiShu(int n) {
    	boolean flag=true;
    	for(int i=2;i<n;i++) {
    		if(n%i==0) {
    			flag=false;
    		}
    	}
    	return flag;
    }
}
	

3题目

字母连连看,给定一个由小写英文字母组成的字符串(长度<1000),如果字符串中有两个连续的字母相同,则这两个字母可同时消除,并不断重复该操作,直到不能消除为止。请编程判断该字符串是否可以完全消除。
输入说明:一个字符串。
输出说明:如果可以完全消除,输出“YES”,如果不可以,输出消除后的结果。
输入样例1:abacddcaba
输出样例1:YES
输入样例2:asdfghhgf
输出样例2:asd
————————————————
版权声明:本文为CSDN博主「@小聂同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43482906/article/details/111409349

import java.util.Scanner;



public class test2 {
	public static void main(String[] args) {
		Scanner input =new Scanner(System.in);
		String str=input.next();
		String s=check(str);
		if(s.length()<1) {
			System.out.println("YES");
		}else {
			System.out.println(s);
		}
		
		
	}
	public static String check(String str) {
		String s1=str;
		for(int i=0;i<s1.length()-1;i++) {
			if(s1.charAt(i)==s1.charAt(i+1)) {
				s1=s1.substring(0,i)+s1.substring(i+2,s1.length());
			}
			
		}
		if(s1.equals(str)){
			return s1;
		}else {
			return check(s1);
		}
	}

}

4题目

.统计整数区间[N,M] (N,M<100000)中所有非偶数的合数个数,并输出这个数。
输入说明:两个整数N、M
输出说明:非偶数的合数个数
输入样例:2 16
输出样例:2

public class test {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int N=input.nextInt();
        int M=input.nextInt();
        int count=0;
        boolean flag=false;
        for(int i=N;i<M;i++){
            if(i%2==0){
                continue;
            }
            if(!isZhiShu(i)){
                count++;
            }
        }
        System.out.println(count);

    }

   public static boolean isZhiShu(int n){
        for(int i=2;i<n;i++){
            if(n%i==0){
                return false;
            }
        }
        return true;
   }


}

5题目

对于给定的字符数组(字符数少于10000),统计其中字母类型、数字类型和符号类型的字符出现次数,其中字母类型是英文字母a-z之间的字符(不区分大小写);数字类型是0-9之间的字符;符号类型是除英文字母、数字及空格外的其它字符。
输入说明:一个字符序列
输出说明:分三行输出:第一行字母类型,以a-z标识;第二行数字类型,以0-9标识;第三行符号类型,以others标识。每行格式如下:
类别标识出现次数(中间用一个空格分隔)
输入样例: Hello World!
输出样例: a-z 10
0-9 0
others 1

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int num = 0;
        int abz = 0;
        int cb=0;
        int others = 0;
        int cout=0;
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if ((int) chars[i] == 32) {
                continue;
            } else if ((int) chars[i] >= 48 && (int) chars[i] <= 57) {
                num++;
                //continue;
            } else if ((int) chars[i] >= 65 && (int) chars[i] <= 90) {
                abz++;
                //continue;
            }else if((int) chars[i]>=97 &&(int)chars[i]<=122) {
                cb++;
            }
            else {
                others++;
            }
            cout=abz+cb;
        }
        System.out.println("a-z " + cout);
        System.out.println("0-9 " + num);
        System.out.println("others " + others);
        in.close();
    }
  • 2
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值