13年省赛蓝桥杯JavaB

一、世纪末的星期

答案:2299

代码展示:

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        for(int i = 1999; i <= 9999; i+= 100) {
            calendar.set(i,12 - 1,31);
            if(calendar.get(Calendar.DAY_OF_WEEK ) == 1) {
                System.out.println(i);
                break;
            }
        }
    }
    
}
  • 相关知识点:

1. 如何创建 Calendar 对象

Calendar 是一个抽象类, 无法通过直接实例化得到对象. 因此, Calendar 提供了一个方法 getInstance,来获得一个Calendar对象, 得到的 Calendar 由当前时间初始化.

Calender calender = Calender.getInstance();
2. 字段详解

下面字段我们以 1998 年 2 月 28 日 23 时 11 分 11 秒 来讲解

1. YEAR

默认情况下指示为年份.

例子中 YEAR 为 1998

2. MONTH

指示当前年中的月份数,一年中的一月的值为 0

需要注意的是 JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER 分别与 [0, 11] 对应, 在设置和获取日期时要格外注意3.WEEK_OF_YEAR

指示当前年中的星期数. 一年中的第一个星期的值为 1.

例子中 WEEK_OF_YEAR 为 9

4.WEEK_OF_MONTH

指示当前月中的星期数. 一个月中第一个星期的值为 1.

例子中 WEEK_OF_MONTH 为 5

5.DAY_OF_MONTH

指示一个月中的某天. 它与 DATE 是同义词. 一个月中第一天的值为 1.

例子中 DAY_OF_MONTH 为 28

6. DATE

同 DAY_OF_MONTH

7.DAY_OF_YEAR

指示当前年中的天数. 一年中第一天的值为 1.

例子中 DAY_OF_YEAR 为 59

8. DAY_OF_WEEK

指示一个星期中的某天, 一周中第一天的值为 1.

需要 注意 的是, 与中国人的习惯不同, 此处一周中的第一天为 周日. 一周的顺序依次为: 周日(1), 周一(2), 周二(3), 周三(4), 周四(5), 周五(6), 周六(7) 在设置和获取日期时要格外注意

9. AM_PM

指示 HOUR 是在中午之前还是在中午之后. [0, 12) 为上午, AM_PM 值为 1 [12, 24)为下午, AM_PM 值为 0

10. HOUR

指示上午或下午的小时.

例子中 HOUR 为 11

11.HOUR_OF_DAY

指示一天中的小时。 HOUR_OF_DAY 用于 24 小时制时钟

例子中 HOUR_OF_DAY 为 23

12.MINUTE

指示一小时中的分钟

例子中 MINUTE 为 11

13. SECOND

指示一分钟中的秒

例子中 SECOND 为 11

3.相关方法

1.设置值

calender.set(2023,0,1,13,13,58);//设置年月日时分秒为2023年1月1日13时13分58秒
calender.set(Calender.YEAR,2021);//设置年为2021
calender.set(Calender.MONTH,5);//设置月为6
calender.set(Calender.DATE,4);//设置日为4
calender.set(Calender.HOUR_OF_DAT,15);//设置时为15
calender.set(Calender.MINUTE,12);//设置分为15
calender.set(Calender.SECOND,20);//设置秒为20

2.获取值

calender.get (Calendar.YEAR);//年 
calender.get (Calendar.MONTH) + 1;//月 (必须要+1) 
calender.get (Calendar.DATE);//日 
calender.get (Calendar.HOUR_OF_DAY);//时 
calender.get (Calendar.MINUTE);//分 
calender.get (Calendar.SECOND);//秒 
calender.get (Calendar.DAY_OF_WEEK);//星期 (Locale.ENGLISH情况下,周日是1,剩下自己推算)

3.运算值

calender.add (Calendar.YEAR, 1);//年 
calender.add (Calendar.MONTH, 1);//月 
calender.add (Calendar.DATE, 1);//日 
calender.add (Calendar.HOUR_OF_DAY, -1);//时 
calender.add (Calendar.MINUTE, 1);//分 
calender.add (Calendar.SECOND, 1);//秒 
calender.add (Calendar.DATE, 7);//周

二、马虎的算式

答案:142

暴力解决法:

public class Main {

    public static void main(String[] args) {
        int i=0;
        for (int a = 1; a < 10; a++) {
            for (int b = 1; b < 10; b++) {
                if(a==b) {
                    continue;
                }
                for (int c = 1; c < 10; c++) {
                    if(a==c||b==c) {
                        continue;
                    }
                    for (int d = 1; d < 10; d++) {
                        if(a==d||b==d||c==d) {
                            continue;
                        }
                        for (int e = 1; e < 10; e++) {
                            if(a==e||b==e||c==e||d==e) {
                                continue;
                            }
                             if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e)) {
                                i++;
                            }
                        }
                    }
                }
            }
        }
        System.out.println(i);
    }
}

三、振兴中华

答案:35

代码展示:

public class Main {
    public static void main(String[] args) {
        int ans=dfs(0,0);
        System.out.println(ans);
    }
    public static int dfs(int i,int j) {
        if(i == 3 || j == 4) {//找到临界调节
            return 1;
        }
        else {
            return dfs(i+1, j) + dfs(i, j+1);//从终点回溯
        }
    }
}

深度优先遍历写代码步骤:

  1. 找到起始位置

  1. 确定临界条件

  1. 由终点至起点的返回

四、有理数

答案:new Rational(ra*x.rb+rb*x.ra,rb*x.rb)

做题分析:gcd()方法明显为辗转相除法求最大公约数

         Rational()方法为约分

填空位置的突破口为乘法位置new Rational (ra*x.ra,rb*x.rb);

通过类比乘法位置可写出加法位置为new Rational(ra*x.rb+rb*x.ra,rb*x.rb)

即1/3 + 1/6 = (1*6 + 3*1) / (3*6) = 1/2

五、黄金连分数

答案:

0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375

public class Main {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("1");//初始化为1
        BigInteger b = new BigInteger("1");
        //多计算了很多
        for (int i = 0; i < 500; i++) {
            BigInteger temp = b;
            b = a.add(b);
            a = temp;
        }
        BigDecimal decimal = new BigDecimal(a,110).divide(new BigDecimal(b,110),BigDecimal.ROUND_HALF_DOWN);
    System.out.println(decimal.toPlainString().substring(0, 103));//截取了103项,即保留了小数点后101位,根据最后一位数字即可知道小数点后第100位为多少
    }
}
  • 相关知识点:

  1. BigInteger

进行一些大整数的相关操作

  1. 初始化:BigInteger a = new BigInteger("111");此时默认为十进制

                  BigInteger a = new BigInteger("111",2):此时为二进制,a为7

                  BigInteger a = BigInteger.ValueOf(111);将普通整数long转换为大整数

此外,也可以使用 BigInteger a  = BigInteger.ONE; >>>>1

                            BigInteger a = BigInteger.ZERO;>>>>0

                            BigInteger a = BigInteger.TEN;>>>>>10

进行初始化.

  1. 常用方法

BigInteger abs() 返回大整数的绝对值

BigInteger add(BigInteger val) 返回两个大整数的和

       BigInteger subtract(BigInteger val)  返回两个大整数的差

      BigInteger multiply(BigInteger val) 返回两个大整数的积

BigInteger divide(BigInteger val) 返回两个大整数的商

BigInteger gcd(BigInteger val) 返回大整数的最大公约数

BigInteger max(BigInteger val) 返回两个大整数的最大者

BigInteger min(BigInteger val) 返回两个大整数的最小者

BigInteger mod(BigInteger val) 用当前大整数对val求模

BigInteger remainder(BigInteger val) 返回当前大整数除以val的余数

2.BigDecimal

BigDecimal是专门为弥补浮点数无法精确计算的缺憾而设计的类,并且它本身也提供了加减乘除的常用数学算法

  1. 初始化

BigDecimal a= new BigDecimal(111);

BigDecimal b = new BigDecimal("111")尽量使用字符串进行初始化

  1. 常用方法

BigDecimal add(BigDecimal val) //加法

BigDecimal subtract(BigDecimal val) //减法

BigDecimal multiply(BigDecimal val) //乘法

BigDecimal abs(BigDecimal val) //绝对值

      BigDecimal  divide(BigDecimal divisor, int scale,int roundingMode  )

     即为 (BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)

3.toplainstring和tostring

对得到的数据用科学计数法:String.toString()

不使用科学计数法:String toPlainString()

六、三部排序

答案:p++

代码展示:

public class Main {

     static void sort(int[] x){

     int p = 0;

     int left = 0;

     int right = x.length-1;

     

     while(p<=right){
    //将小于0的数和left交换

     if(x[p]<0){

     int t = x[left];

     x[left] = x[p];

     x[p] = t;

     left++;

     p++;

     }
     //将大于0的数和right交换
     else if(x[p]>0){

     int t = x[right];

     x[right] = x[p];

     x[p] = t;

     right--; 

     }
     //当p==0时直接跳过,进行下一次的循环
     else{

     p++;//填空位置

     }

     }

     }
     public static void main(String[] args) {
        int []x =new int[]{25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0};
        for (int i = 0; i < x.length; i++) {
            System.out.print(x[i]+" ");
        }
        sort(x);
        System.out.println();
        for (int i = 0; i < x.length; i++) {
            System.out.print(x[i]+" ");
        }
    }
}
  • 解题思路:本题为代码填空题,认真分析每行代码的功能,以及排序的整体思路,在空缺位置填上对应功能的代码即可

七、错误票据

答案:

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> list = new ArrayList<Integer>();
        int N = sc.nextInt();
        sc.nextLine();//吃掉N后面的换行符
        for (int i = 0; i < N; i++) {//输入所有的数
            String line = sc.nextLine();
            String[] split = line.split(" ");//用空格进行分割,得到若干字符串
            for (int j = 0; j < split.length; j++) {//遍历所有的数
                list.add(Integer.parseInt(split[j]));//解析为整数
            }
        }
        Collections.sort(list);//排序
        int a = 0, b = 0;//a是缺号,b是重号
        for (int i = 1; i < list.size(); i++) {
            if (list.get(i) - list.get(i - 1) == 2)//后面减前面等于2不就等于他断开了么
                a = list.get(i) - 1;
            if (list.get(i) - list.get(i - 1) == 0)//后面减前面等于0不就等于他重号了么
                b = list.get(i);
        }
        System.out.println(a + " " + b);
    }
}
  • 相关知识点:

  1. 从键盘中获取数据的方法
  1. 从键盘中获取一个字符的方法

public static void main(String[] args) throws IOException {
        System.out.println("请输入数据");
        char c = (char)System.in.read();
        System.out.println(c);
    }

虽然此方式实现了从键盘获取输入的字符,但是System.out.read()只能针对一个字符的获取,同时,获取进来的变量的类型只能是char,当我们输入一个数字,希望得到的也是一个整型变量的时候,我们还得修改其中的变量类型,这样就显得比较麻烦。 2.从键盘中获取一行的数据

public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("请输入数据:");
    String str = br.readLine();
    System.out.println(str);
    }

此方法相对于System.in.read()来说,可以获得一行内所有的字符,但是只能获得的类型为字符型,需要其他类型的数据时还有进行转换,相对麻烦。

3.Scanner 

常用方法:

scanner.next()

scanner.nextLine()

scanner.nextInt()

scanner.nextDouble()

scanner.close()

next()和nextLine()的区别:

next():

一定要读取到有效的字符后才可以结束输入

对输入有效字符串之前遇到的空白,next()方法会自动将其去掉

只有输入有效字符串后才将其后面输入的空白作为分隔符或者结束符

next()不能得到带有空白的字符串

nextLine():

以Enter为结束符,返回的是回车之前的所有字符串

可以获得空白

2.Collections

Collections.sort是给List<T>进行排序,而Arrays.sort是给数组进行排序。

Collections.sort实质上是调用的Arrays.sort 此外,Collection提供了降序排列的方法Collections.reverseOrder()

Collections.sort(list,Collections.reverseOrder());
Arrays.sort(list,Collections.reverseOrder()
3.Integer

  1. parseInt() ——把字符串转换成整数

2. compare() ——比较两个int型数的大小

3. intValue() ——将Integer类型转换成int类型

4. max() ——比较两个int型数,返回大的那个数

5. min() ——比较两个int型数,返回小的那个数

6. sum() ——计算两个数的和

7. valueOf() ——将一个整数或者一个字符型整数转换成Integer型

  • 补充:

java中比较的常用方法

  1. ==运算符

常用来比较==左右两侧是否相等,如果左右两侧是基本数据类型,比较的是值是否相等;如果==左右两侧是引用类型,比较的是引用变量的地址是否相等

  1. equals()

常用来比较两个对象的地址是否相同。equalsIgnoreCase比较的是内容并且忽略大小写。

  1. compareTo()

先读取出字符串的第一个“字母”进行比较,比较的方法是ascii码表的值,再一次进行后面字符串的比较,compareTo的返回是这样的

if(指定数=参数)return 0;

if(指定数>参数)return 1,指定数比参数大多数数则返回多少

if(指定数<参数)return -1,指定数比参数小多数则返回负多少

compareTo是对象与方法的参数进行比较,仅用于相同两个数据类型的比较,int不能直接使用,需转换为String类型

变量类型转换的常用方法

1. 自动类型转换(小→大)

Java中的自动类型转换是指将一种数据类型自动转换成另一种数据类型。自动类型转换是从小范围类型到大范围类型的转换,转换时不会丢失精度。

转换规则:

例如:

int i = 10;
double d = i;

在上面的示例中,将int类型的变量i自动转换为double类型的变量d,转换时不会丢失精度。

2.强制类型转换

Java中的强制类型转换是指将一种数据类型强制转换成另一种数据类型。强制类型转换是从大范围类型到小范围类型的转换,转换时可能会丢失精度。

例如:

double d = 3.14;
int i = (int)d;

在上面的示例中,将double类型的变量d强制转换为int类型的变量i,转换时可能会丢失精度。

3.包装类转换为基本数据类型

Java中的基本数据类型都对应有对应的包装类。包装类之间的转换可以通过构造函数或者valueOf方法实现。

例如:

Integer i = new Integer(10);

int j = i.intValue();

在上面的示例中,通过Integer类的构造函数将int类型的变量10转换为Integer对象i,然后通过intValue方法将Integer对象i转换为int类型的变量j。

4. 字符串与基本数据类型之间的转换

Java中的字符串可以通过parseInt、parseDouble等方法将其转换为基本数据类型。同时也可以使用valueOf()将字符串转换为包装类

例如:

String s = "10";

int i = Integer.parseInt(s);

在上面的示例中,通过parseInt方法将字符串"10"转换为int类型的变量i。

八、带分数

答案:

import java.util.Scanner;

public class Main {
        static int[] arr = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9};
        static int n = arr.length ;
        static int nums = 0;
        public static void main( String[] args ) {
            Scanner sc = new Scanner( System.in );
            int N = sc.nextInt();
            permutation( N , 0 );
            System.out.println( nums );
        }
        public static void permutation( int N , int x ) {
            if( x == n ) {
                count( N );
                return;
            }
            for( int i = x ; i < n ; i++ ) {
                int temp = arr[i];
                arr[i] = arr[x];
                arr[x] = temp;
                permutation( N , x + 1 );
                arr[x] = arr[i];
                arr[i] = temp;
            }
        }
        public static void count( int N ) {
            int i , j ;
            for (i = 0; toNum( 0, i) < N ; i++)
                for (j = i + 1 ; j <= n - 2 ; j++){
                    if ( toNum( 0, i )+ 1.0 * toNum( i + 1 , j ) / toNum( j + 1 ,  n - 1 ) == N )
                        nums++;
                }
        }
        public static int toNum( int begin ,int over ){
            int t = 1 ,num = 0;
            for ( int i = over ; i >= begin ; i-- ){
                num = num + t * arr[i];
                t *= 10;
            }
            return num;
        }
}

九、幸运数

答案:

import java.util.ArrayList;
import java.util.List;
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();

        List<Integer> list = new ArrayList<>();
        for(int i=1;i<=m;i++){
            list.add(i);
        }

        int luck = 2; //幸运数
        int k = 1;  //下标
        List<Integer> remove = new ArrayList<>();  //等待被移除的数字
        while(luck<=list.size()){
            int cnt = 0;//代表list中目前删除了几个数字
            for(int i=luck;i<=list.size();i++){
                if(i%luck==0){
                    remove.add(i);
                }
            }


            for(int j=0;j<remove.size();j++){//将下标为remove中的数字移除
                list.remove(remove.get(j)-(cnt++)-1);
            }
            remove.clear();

            luck = list.get(k++);
        }
        int count = 0;
        for(int i=0;i<list.size();i++){
            if(list.get(i)>n&&list.get(i)<m){
                count++;
            }
        }
        System.out.println(count);
    }
}

十、连号区间数

答案

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int []arr=new int[n];
        for(int i=0;i<n;i++) {
            arr[i]=sc.nextInt();
        }
        int count=0;
        for(int j=0;j<arr.length;j++) {
            int max = Integer.MIN_VALUE;
            int min = Integer.MAX_VALUE;
            for(int k=j;k<arr.length;k++) {
                max = Math.max(max, arr[k]);
                min = Math.min(min, arr[k]);
                if(max - min == k - j) {
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十亿少男的梦421

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

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

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

打赏作者

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

抵扣说明:

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

余额充值