3月蓝桥集训第二周总结(Java解析)

3月蓝桥集训第二周总结(Java解析)

1.分数

题目描述

在这里插入图片描述

代码解析

这题很简单,找出分子的规律就行。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int fenzi=1;
        int fenmu=1;
        for(int i=1;i<20;i++){
            fenmu*=2;
            fenzi+=fenmu;
        }
        System.out.println(fenzi+"/"+fenmu);
        scan.close();
    }
}

2.回文日期

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入输出样例

在这里插入图片描述

代码解析

这道题主要想不到怎么根据年份来确定具体的日期。看了题解才懂,按自己写的直接对日期进行循环,通过率只有80(剩下的20因为复杂度太高而通过不了),对year进行循环时间复杂度会降低,达到100通过率。

import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
//要构造两个方法,一个是否为回文日期,另一个是否为ABABBABA类型的回文日期,个人感觉第二个方法基于第一个方法,
//判断是回文数之后,再根据条件判断其符合ABABBABA型的回文数,需要注意的是月日的限制条件。
 
public class Main {
public static void main(String[] args) {
   Scanner scan = new Scanner(System.in);
   //在此输入您的代码...
   int n=scan.nextInt();
   String ss=n+"";
   int year=Integer.parseInt(ss.substring(0,4));
   int month=Integer.parseInt(ss.substring(4,6));
   int date=Integer.parseInt(ss.substring(6,8));
   for(int i=year;;i++){
	   int t=i;
	   int m=i;
	   while(t>0){
		   m=m*10+t%10;
		   t/=10;
	   }
       if(huiwen(m)){
         System.out.println(m); 
         break;
       }
   }
   for(int i=year;;i++){
	   int t=i;
	   int m=i;
	   while(t>0){
		   m=m*10+t%10;
		   t/=10;
	   }
  	 if(ABA(m)){
           System.out.println(m);
           break;
         }
    }
   scan.close();
}
public static boolean huiwen(int j){
     String arr=j+"";
     int year=Integer.parseInt(arr.substring(0,4));
     int month=Integer.parseInt(arr.substring(4,6));
     int date=Integer.parseInt(arr.substring(6,8));
     char [] c=arr.toCharArray();
     for(int i=0;i<c.length/2;i++){
       if(c[i]!=c[c.length-i-1]){
         return false;
       }
     }
     if(month==2&&date>29&&runyear(year)){
  	   return false;
     }
     if(month==2&&date>28&&pingyear(year)){
  	   return false;
     }
     if(date==0||month==0||month>12){
    	 return false;
     }//判断日期为0,月份为0,月份>12的情况
     if(month==1&&date>31||month==3&&date>31||month==5&&date>31||month==7&&date>31||month==8&&date>31||month==10&&date>31||month==12&&date>31){
    	 return false;
     }//判断有31天的月份
if(month==4&&date>30||month==6&&date>30||month==9&&date>30||month==11&&date>30){
    	 return false;
     }//判断有30天的月份
     return true;
}
public static boolean ABA(int k){
 if(huiwen(k)){
   String brr=k+"";
   char [] d=brr.toCharArray();
   if(d[0]==d[2]&&d[2]==d[5]&&d[5]==d[7]&&d[1]==d[3]&&d[3]==d[4]&&d[4]==d[6]){
     return true;
   }
 }
 return false;
}
public static boolean runyear(int n){
   if(n%4==0&&n%100!=0){
     return true;
   }
   return false;
}
public static boolean pingyear(int n){
   if(n%4!=0){
     return true;
   }
   return false;
}
}

3.迷宫

问题描述

在这里插入图片描述

输入格式

在这里插入图片描述

输出格式

在这里插入图片描述

样例输入

在这里插入图片描述

样例解析

在这里插入图片描述

评测用例

在这里插入图片描述

代码解析

import java.util.*;
import java.io.*;
public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  static StreamTokenizer st = new StreamTokenizer(br);
  static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
	static int n, m;
	static int[][]arr = new int[2010][2010];
	static Map<String, List<int[]>> map = new HashMap<>();
	static double ans = 0;
	public static void main(String[] args) throws Exception {
		n = nextInt();
		m = nextInt();
		for (int i = 0; i < m; i++) {
			String[] kk = br.readLine().split(" ");
			int x1 = Integer.parseInt(kk[0]), y1 = Integer.parseInt(kk[1]);
			int x2 = Integer.parseInt(kk[2]), y2 = Integer.parseInt(kk[3]);
			String s = x1 + ":" + y1, ss = x2 + ":" + y2;
			add(s, x2, y2);
			add(ss, x1, y1);
		}
		bfs();
		pw.printf("%.2f", ans / (n * n));
		pw.flush();
	}
	public static void bfs() {
		Queue<int []> q = new LinkedList<>();
		q.add(new int[] {n, n});//从终点开始往前走,走到每一个点
		arr[n][n] = 0;
		int xa,ya;
		while (!q.isEmpty()) {//队列为空时结束
			int []t=q.poll();//弹出队头
			int x=t[0],y=t[1];
			for(int i=-1;i<2;i+=2){//上下两边的判断
			    xa=x+i;
			    if(pd(xa,y)){
			        q.add(new int[]{xa,y});//加入队列
			        arr[xa][y]=arr[x][y]+1;//到达这一个位置的最小步数
			        ans+=arr[xa][y];//计数
			    }
			}
			for(int i=-1;i<2;i+=2){//左右两边的判断
			    ya=y+i;
			    if(pd(x,ya)){
			        q.add(new int[]{x,ya});//加入队列
			        arr[x][ya]=arr[x][y]+1;//到达这一个位置的最小步数
			        ans+=arr[x][ya];//计数
			    }
			}
			String key = x + ":" + y;
			if (map.containsKey(key)) {//传送阵的判断
				List<int[]> li = map.get(key);
				for (int[] b: li) {
					if (pd(b[0], b[1])) {
						q.add(new int[] {b[0], b[1]});//加入队列
						arr[b[0]][b[1]] = arr[x][y]+1;//到达这一个位置的最小步数
						ans+=arr[b[0]][b[1]];//计数
					}
				}
			}
		}
	}
	public static void add(String key, int x, int y) {//存放传送阵
		List<int[]> li = map.getOrDefault(key, new ArrayList<>());
		li.add(new int[] {x, y});
		map.put(key, li);
	}
	public static boolean pd(int x, int y) {//判断改点是否在迷宫范围内且为经过
		if (x>=1&&x<=n&&y>=1&&y<=n&&arr[x][y]==0&&x*y<n*n) return true;
		return false;
	}
	public static int nextInt() throws Exception {//int型
        st.nextToken();
        return (int) st.nval;
    }
    public static long nextLong() throws Exception {//long型
        st.nextToken();
        return (long) st.nval;
    }
}

4.找素数

题目描述

在这里插入图片描述

代码解析

if(count==99998)那个要与if(sushu(i))并列.

import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
 
public class Main {
 public static void main(String[] args) {
	 int count=0;
     //在此输入您的代码...
     for(int i=9;;i++){
       if(sushu(i)){
         count++;
       }
       if(count==99998){
    	   System.out.println(i);
           break;
      }
       
     }
 }
 public static boolean sushu(int n){
   for(int i=2;i<=Math.sqrt(n);i++){
       if(n%i==0){
         return false;
       }
   }
   return true;
 }
}

5.图书排列

题目描述

在这里插入图片描述

代码解析

这题经典的DFS题目,首先看题目需要用到的方法,首先我们要构造exch方法,对每一个数进行交换,实现所有的可能,同时还需构造一个check方法,看看是否满足题目要求(要求编号相邻的书不能放在相邻的位置。)。由于知道需要回溯,所以构造dfs方法,在dfs中调用check以及exch方法实现对所有可能的筛选。

public class Main {
    static int []arr={1,2,3,4,5,6,7,8,9,10};
    static int ans=0;
	public static void main(String[] args) {
		dfs(0);
		System.out.println(ans);
	}
	static void dfs(int k){
		if(k==arr.length){
			if(check()){
				ans++;
			}
		}
		for(int i=k;i<arr.length;i++){
			exch(i,k);
			dfs(k+1);
			exch(i,k);
		}
	}
	static boolean check(){
		for(int i=0;i<arr.length-1;i++){
			if(Math.abs(arr[i+1]-arr[i])==1){
				return false;
			}
		}
		return true;
	}
	static void exch(int a,int b){
		int temp;
		temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;
	}
 
}

6.日志统计

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入输出样例

在这里插入图片描述

代码解析

这题好难,看了题解才勉强看懂,可能刚接触双指针不太了解。这题的思路主要是判断 arr[L][1]是否等于arr[R][1](当不等于的时候,判断这时候是否符合热帖的概念,即:arr[R][0]-arr[L][0]<d,R-L+1>=k。当满足上述两个条件时,令t=1,所以当t=1的时候,当前编号L为热帖)。最后需要对最后一个编号多进行一次判断。对了,值得一提的是,这里用Scanner输入输出会导致部分超时,这时用BR可以满足OJ。

import java.util.Arrays;
import java.io.*;
public class Shuangzhizhen {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st = new StreamTokenizer(br);
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) throws Exception {
      int n=nextInt();
      int d=nextInt();
      int k=nextInt();
      int[][]arr=new int[n][2];
      for(int i=0;i<n;i++){
    	  arr[i][0]=nextInt();
    	  arr[i][1]=nextInt();
      }
      Arrays.sort(arr,((a,b)->{
    	  if(a[1]!=b[1]){
    		  return a[1]-b[1];
    	  }
    	  return a[0]-b[0];
      }));
      int t=0,s=0;
      int []brr=new int[n];
      int l=0;
      for(int r=0;r<n;r++){
    	  if(arr[r][1]!=arr[l][1]){
    		  if(t==1){
    			  brr[s++]=arr[l][1];
    		  }
    		  t=0;
    		  l=r;
    	  }
    	  if(arr[r][0]-arr[l][0]>=d){
    		  l++;
    	  }
    	  if(r-l+1>=k){
    		  t=1;
    	  }
      }
      if(t==1){
    	  brr[s++]=arr[n-1][1];}
    for(int i=0;i<s;i++){
    	  pw.println(brr[i]);
    	  pw.flush();
    	  }
      }
    
    public static int nextInt() throws Exception {//int型
        st.nextToken();
        return (int) st.nval;
    }
 
    public static long nextLong() throws Exception {//long型
        st.nextToken();
        return (long) st.nval;
    }
}

7.杨辉三角

题目描述

在这里插入图片描述

输入输出描述

在这里插入图片描述

输入输出样例

在这里插入图片描述

样例评测

在这里插入图片描述

代码解析

自己来看,最多只能暴力拿分。System.out.println((n*(n+1)/2)+2);不过看了怂佬的题解才明白,说实话这道题看起来不难,但实际上完全理解要花较多头脑。对了这里用到的return,当找到合适的数的时候,return会跳出当前的方法,不去执行最后System.out.println((n*(n+1)/2)+2);这一段代码了,这个时候就不能用break了。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        long n=scan.nextLong();
        int []arr=new int[44725];
        arr[0]=1;
        long k=1L;
        if(n==1){
          System.out.println(1);
          
        }
        for(int i=1;i<44725;i++){
          for(int j=i;j>=1;j--){
            arr[j]+=arr[j-1];
            if(arr[j]==n){
              System.out.println(k+i-j+1);//前四行所有的数加上当前行数i(i为当前行有多少个数)-j+1;
              return;
            }
          }
          k+=i+1;
        }
        System.out.println((n*(n+1)/2)+2);
        scan.close();
    }
}

8.裁剪刀

问题描述

在这里插入图片描述

代码解析

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        System.out.println(19+20*21+4);
        scan.close();
    }
}

9.刷题统计

问题描述

在这里插入图片描述

输入输出格式

在这里插入图片描述

样例输入输出

在这里插入图片描述

评测用例

在这里插入图片描述

代码解析

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
     Scanner scan = new Scanner(System.in);
     long a=scan.nextLong();
     long b=scan.nextLong();
     long n=scan.nextLong();
     long j=a*5+b*2;//每周刷的题目
     long k=n/j;//刷了多少周
     long d=n-k*j;//剩余题目
     long l=0;
     if(d==0){
       System.out.println(k*7);
     }else{
        for(int i=1;i<=7;i++){
         if(i<=5){
           l+=a;
         }
         if(i>5){
           l+=b;
         }
         if(l>=d){
           System.out.println(k*7+i);
           return;
         }
     }
 }
     }
     
}

10.修建灌木

问题描述

在这里插入图片描述

输入输出格式

在这里插入图片描述

样例

在这里插入图片描述

代码解析

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n=scan.nextInt();
        for(int i=1;i<=n;i++){
          if(i==1){
            System.out.println((n-1)*2);
          }
          if(i>1&&i<=n/2){
            System.out.println((n-i)*2);
          }//左边的点
          if(n%2==1&&i==n/2+1){
            System.out.println((i-1)*2);
          }//中间点
          if(n%2==1&&i>=n/2+2&&i<n){
            System.out.println((i-1)*2);
          }//n为奇数,右侧的点
          if(n%2==0&&i>=n/2+1&&i<n){
            System.out.println((i-1)*2);
          }//n为偶数,右边的点
          if(i==n){
            System.out.println((n-1)*2);
            return;
          }
        }
        
    }
}

11.K倍区间

问题描述

在这里插入图片描述

输入输出描述

在这里插入图片描述

样例

在这里插入图片描述

代码解析

前缀和+哈希表,看One佬的。自己写想着把输入的数组成一个字符串,然后用substring的方法取区间,将每个区间里面的每一个数进行相加,进行判断是否为K的倍数,最后统计符合条件的个数,但是自己不懂怎么将输入的数组成一个字符串,因为题目是每一行输入一个数,不懂得怎么将每一行的每一个数组合起来然后转成字符串转。

import java.io.*;
import java.util.*;
public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    
    static int N = (int)1e5 + 10, n, k;
    static int[] a = new int[N], pre = new int[N];
    static Map<Integer, Integer> map = new HashMap<>();
    
    public static void main(String[] args) throws Exception {
    	String[] s = in.readLine().split(" ");
    	n = Integer.parseInt(s[0]);
    	k = Integer.parseInt(s[1]);
    	for (int i = 1; i <= n; i++) {
    		a[i] = Integer.parseInt(in.readLine());
    		pre[i] = (pre[i - 1] + a[i]) % k;
    	}
    	long ans = 0L;
    	for (int i = 0; i <= n; i++) {
    		ans += map.getOrDefault(pre[i], 0);
    		map.put(pre[i], map.getOrDefault(pre[i], 0) + 1);
    	}
    	
    	out.println(ans);
 	
        out.flush();
        in.close();
    }
}

12. 卡片

题目描述

在这里插入图片描述

代码解析

这道题首先将从1-20210的数转成字符串str,再对其进行循环,循环范围为str.length,将每一个字符串的每一位进行遍历,用str.charAt()的方法来找1,每找到1个1,count++。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        int count=0;
        for (int i = 1; i < 20210; i++) {
            String str=i+"";
            for (int j = 0; j < str.length(); j++) {
                if(str.charAt(j)=='1')
                {
                    count++;
                }
            }
            if(count==2021)
            {
                System.out.println(str);
                break;
            }
        }
        
        scan.close();
    }
}

13.路径

题目描述

在这里插入图片描述

代码解析

一道简单的动态规划问题。题目首先定义dp[]的含义,然后定义dp[]的初值,由于需要选取最小的一个路径,所以需要用到 Max.min的方法。同时这道题目需要用到辗转相除法求得最大公约数,然后再求最小 公倍数。

import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
 
public class Main {
 public static void main(String[] args) {
     Scanner scan = new Scanner(System.in);
     //在此输入您的代码...
     int n=2021;
     int []dp=new int[n+1];//表示从1-目标结点的最短路径,则dp[2021]为题目所求。
     dp[1]=0;
     for(int i=2;i<=2021;i++){
          dp[i]=Integer.MAX_VALUE;//初始化
     }
     for(int i=1;i<=2020;i++){
       for(int j=i+1;j<=2021&&(j-i)<=21;j++){
    	   
         dp[j]=Math.min(dp[j],dp[i]+zxgbs(i,j));
       }
     }
     System.out.println(dp[2021]);
     scan.close();
 }
 public static int gcd(int a,int b){
        return b!=0 ? gcd(b,a%b):a;//辗转相除法求最大公约数,如果b等于0,则返回a。,如果不等于0继续辗转相除。
 }
 public static int zxgbs(int a,int b){
   return a*b/gcd(a,b);
 }
}

14.字符统计

题目描述

在这里插入图片描述

输入输出格式

在这里插入图片描述

样例输入输出及评测用例

在这里插入图片描述

代码解析

从键盘输入一个字符串,首先将字符串里的每一个字符遍历,所以用到一个for循环,str里的每一个字符减去’A’或者65(因为A的二进制代码为65)。将减去所得的结果归纳到一个数组里面。后面判断数组的最大值来找到出现最多次数的字母。最后再判断数组里最大的值是否唯一,如果不唯一,则输出最大值所在数组位置的字符。

import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
 
public class Main {
 public static void main(String[] args) {
     Scanner sc = new Scanner(System.in);
     //在此输入您的代码...
     int[]m=new int[26];
     String str;
     str=sc.next();
     
     for(int i=0;i<str.length();i++){
       m[(int)(str.charAt(i)-'A')]++;
     }
     int max=0;
     for(int i=0;i<m.length;i++){
       max=Math.max(max,m[i]);
     }
     for(int i=0;i<m.length;i++){
       if(m[i]==max){
         System.out.print((char)(i+'A'));
       }
     }
     sc.close();
 }
}

15.费用报销

问题描述

在这里插入图片描述

输入输出格式

在这里插入图片描述

样例输入输出及评测用例

在这里插入图片描述

代码解析

类似01背包的问题

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
 
public class Main {
 public static void main(String[] args) {
     Scanner sc = new Scanner(System.in);
     //在此输入您的代码...
     int []sj={0,31,28,31,30,31,30,31,31,30,31,30,31};
     int [][]arr=new int[1010][2];
     boolean [][]pd=new boolean[1010][5010];
     int n=sc.nextInt();
     int m=sc.nextInt();
     int k=sc.nextInt();
     for(int i=1;i<=12;i++){
       sj[i]+=sj[i-1];
     }
     for(int i=1;i<=n;i++){
       arr[i][0]=sj[sc.nextInt()-1]+sc.nextInt();//
       arr[i][1]=sc.nextInt();
     }
     Arrays.sort(arr,1,n+1,Comparator.comparingInt(a->a[0]));
     pd[0][0]=true;
     int l=0;
     int max=0;
     for(int i=1;i<=n;i++){
       while(arr[i][0]-arr[l+1][0]>=k)l++;
       for(int j=0;j<=m;j++){
         pd[i][j]=pd[i-1][j];
         if(j>=arr[i][1]&&pd[l][j-arr[i][1]]==true){
           pd[i][j]=true;
           max=Math.max(max,j);
         }
       }
     }
     System.out.println(max);
     sc.close();
 }
}

16. 0的个数

问题描述

在这里插入图片描述

输入输出格式

在这里插入图片描述

样例输入输出及评测

在这里插入图片描述

代码解析

需要注意一点只需要算末尾的0,不算前面的,所以不要从头开始循环,要从末尾开始。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        String str=scan.nextLine();
        int sum=0;
        for(int i=str.length()-1;i>=0;i--){
          if(str.charAt(i)=='0'){
            sum++;
          }else{
            break;
          }
        }
        System.out.println(sum);
        scan.close();
    }
}

17.超级质数

问题描述

在这里插入图片描述

答案提交

在这里插入图片描述

代码解析

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        for(int i=1000000;i>=2;i--){
          if(check(i)){
            System.out.println(i);
            return;
          }
        }
        scan.close();
    }
    public static boolean check(int n){
          String str=n+"";
          for(int i=0;i<str.length();i++){
            for(int j=i+1;j<=str.length();j++){
              int k=Integer.parseInt(str.substring(i,j));
              if(!zhishu(k)){
                return false;
              }
            }
          }
          return true;
    }
    public static boolean zhishu(int m){
           if(m==1){
             return false;
           }
           for(int i=2;i<=Math.sqrt(m);i++){
             if(m%i==0){
                return false;
             }
           }
           return true;
    }
}

18.卡牌

问题描述

在这里插入图片描述

输入输出格式

在这里插入图片描述

样例输入输出及评测用例

在这里插入图片描述

代码解析

二分查找

import java.io.*;
import java.util.Scanner;
public class Main {
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
  
    static int[]a;
    static int[]b;
    static int n;
    static long m;
    public static void main(String[] args) throws IOException {
        String[] s=ins.readLine().split(" ");
        n=Integer.parseInt(s[0]);
        m=Long.parseLong(s[1]);
        a=new int[n];
        b=new int[n];
        String[] s2=ins.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            a[i]=Integer.parseInt(s2[i]);
        }
        String[] s3=ins.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            b[i]=Integer.parseInt(s3[i]);
        }
        int l=0;
        int r=2*n;
        int ans=0;
        while (l<=r){
            int mid=(l+r)/2;
            if(check(mid)){
                ans=mid;
                l=mid+1;
            }else {
                r=mid-1;
            }
        }
        out.println(ans);
        out.flush();
    }
    static boolean check(int t){
        long temp=m;
        for (int i = 0; i < n; i++) {
            if(a[i]>=t)continue;
            if(b[i]+a[i]<t)return false;
            if(temp+a[i]<t)return false;
            if(t-a[i]<=temp){
                temp-=(t-a[i]);
            }else{
                return false;
            }
        }
        return true;
    }
}

19.特殊日期

题目描述

在这里插入图片描述

答案提交

在这里插入图片描述

代码解析

构造两个方法,一个判断是否为闰年,一个用来计算年月日位数和。

import java.util.Scanner;
 
public class Main {
	  static int count;
	  static int[] days={0,31,28,31,30,31,30,31,31,30,31,30,31};
	    public static void main(String[] args) {
	        Scanner scan = new Scanner(System.in);
	        for(int i=1900;i<=9999;i++){
	           days[2]=isLeap(i)?29:28;
	           for(int j=1;j<=12;j++){
	             for(int k=1;k<=days[j];k++){
	               if(count(i)==count(j)+count(k)){
	                 count++;
	               }
	             }
	           }
 
	        }
	        System.out.println(count);
	        scan.close();
	    }
	    public static boolean isLeap(int year){
	      return (year%4==0&&year%100!=0)||year%400==0;
	    }
	    public static int count(int n){
	      int m=0;
	      while(n>0){
	        m+=n%10;
	        n=n/10;
	      }
	      return m;
	    }
	}

20.重合次数

问题描述

在这里插入图片描述

答案提交

在这里插入图片描述

代码解析

这题手算的,需要注意59分和00分算同一次。59*7+(95-14+1)+(35-1+1)

public class Main {
    public static void main(String[] args) {
        System.out.println(494);
    }
}

21.左移右移

问题描述

在这里插入图片描述

输入输出格式

在这里插入图片描述

样例输入输出及评测用例

在这里插入图片描述

代码解析

这道题主要是靠权值来给原数组进行排序,这时候我们要定义一个二维数组,用Arrays.sort(nums,1,n+1,(a,b)->(a[1]-b[1]));(必须记住)。

import java.util.Arrays;
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 [][]nums=new int [n+1][2];
        for(int i=1;i<=n;i++){
          nums[i][0]=i;
        }
        int l=0;
        int r=n;
        while(m-->0){
          String dir=sc.next();
          int num=sc.nextInt();
          if(dir.equals("L")){
            nums[num][1]=--l;
          }
          else{
            nums[num][1]=++r;
          }
        }
        Arrays.sort(nums,1,n+1,(a,b)->(a[1]-b[1]));
        for(int i=1;i<=n;i++){
          System.out.printf("%d ",nums[i][0]);
        }
        sc.close();
    }
}

21.组队

问题描述

在这里插入图片描述
在这里插入图片描述

代码解析

人脑神经计算法

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println(97+99+99+97+98);
        scan.close();
    }
}

22.不同子串

题目描述

在这里插入图片描述

代码解析

这道题主要涉及到去重,所以我们要想到HashSet方法里set的去重 ,而对于子串,可以用substring来取每一个子串。

import java.util.Scanner;
import java.util.HashSet;
import java.util.Set;
// 1:无需package
// 2: 类名必须Main, 不可修改
//将字符串的每一个字串输出,统计有多少个字串,看看字串是否相等,将一样的字符串归为一种
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //在此输入您的代码...
        String str="0100110001010001";
        Set<String> set=new HashSet<>();
        for(int i=0;i<str.length();i++){
          for(int j=i+1;j<=str.length();j++){
            String s=str.substring(i,j);
            set.add(s);
          }
        }
        System.out.println(set.size());
        sc.close();
    }
}

23.等差数列

题目描述

在这里插入图片描述

输入输出描述

在这里插入图片描述

样例输入输出及评测样例

在这里插入图片描述

代码解析

注意找最小公差。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //在此输入您的代码...
        int n=sc.nextInt();
        int []nums=new int[n];
        for(int i=0;i<n;i++){
          nums[i]=sc.nextInt();
        }//输入整数
        Arrays.sort(nums);//从小到大排列输入的数字
        int min=Integer.MAX_VALUE;//找到最小的差构成等差数列
        for(int i=1;i<n;i++){
          if(nums[i]-nums[i-1]<min){
            min=nums[i]-nums[i-1];//两两比较找出最小差
          }
        }
        if(min==0){
          System.out.println(n);
          return;
        }
        int res=(nums[n-1]-nums[0])/min+1;//最大的数-最小的数/公差+1=该数列的个数
        System.out.println(res);
        sc.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值