蓝桥杯高校新生编程赛第二场题解——Java

01. 季度归类【新生编程赛】

完整解题代码:

复制代码
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();
        if (N==1 || N==2 || N==3){
            System.out.println("Q1");
        }else if (N==4 || N==5 || N==6){
            System.out.println("Q2");
        }
        else if (N==7 || N==8 || N==9){
            System.out.println("Q3");
        }
        else if (N==10 || N==11 || N==12){
            System.out.println("Q4");
        }else{
            System.out.println("??");
        }
        scan.close();
    }
}

解题思路:

超级无敌简单题,使用判断语句暴力求解即可

02. 新生棋局【新生编程赛】

完整解题代码:

复制代码
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();
        System.out.println("YES");
        scan.close();
    }
}

解题思路:

**1.明确目标:**一开始看到题目,以为需要非常复杂且繁琐的代码量,奇偶性的约束条件,看起来十分唬人,没有目标,根本无法下手。

2.仔细分析: 我们可以把N×N的棋盘想象成 "国际象棋棋盘",用黑白两色交替染色(相邻格子颜色不同)。此时棋盘被分为两个集合:

  • 黑色格子集合(记为集合 A)
  • 白色格子集合(记为集合 B)

当N是奇数 时,N²也是奇数,因此两个集合的格子数量会相差 1

  • 集合 A 的格子数:(N²+1)/2
  • 集合 B 的格子数:(N²-1)/2

举个例子:N=3(3×3 棋盘,共 9 格)

  • 集合 A(比如黑色)有 5 格,集合 B(白色)有 4 格,满足 5=(9+1)/2,4=(9−1)/2。

**3.进一步验证:**1 到N²中奇偶数字的数量,在1,2,...,N²中:

  • 奇数的数量是 ⌈N²/2⌉(向上取整)。当N²是奇数时,⌈N²/2⌉=(N²+1)/2。
  • 偶数的数量是 ⌊N²/2⌋(向下取整)。当N²是奇数时,⌊N²/2⌋=(N²−1)/2。

同样以N=3为例(数字 1~9):

  • 奇数有 1、3、5、7、9,共 5 个,即 (9+1)/2=5。
  • 偶数有 2、4、6、8,共 4 个,即 (9−1)/2=4。

此时,棋盘的两个集合(A 和 B)的大小,恰好等于1 到N2中奇偶数字的数量:

  • 集合 A 的格子数 (N²+1)/2 = 奇数的数量。
  • 集合 B 的格子数 (N²−1)/2 = 偶数的数量。

因此,我们可以直接将所有奇数填入集合 A 的格子所有偶数填入集合 B 的格子。由于集合 A 和集合 B 的格子是 "相邻必不同色"(即相邻格子奇偶性不同),所以这种填法完全满足题目中 "相邻格子奇偶性不同" 的约束。

**4.输出:**因此直接输出"YES"即可。

03.借书卡编号【新生编程赛】

完整解题代码:

复制代码
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();
        String str=String.format("%06d",N);
        int num1=Integer.parseInt(str);
        
        int d1=num1%10;
        num1=num1/10;
        int d2=num1%10;
        num1=num1/10;
        int d3=num1%10;
        num1=num1/10;
        int d4=num1%10;
        num1=num1/10;
        int d5=num1%10;
        num1=num1/10;
        int d6=num1%10;

        if(d1+d2+d3==d4+d5+d6){
          System.out.println("YES");
        }else{
          System.out.println("NO");
        }
        scan.close();
    }
}

解题思路:

**1.明确目标:**题目无非要求将输入的一个整数(如不足 6 位,在前面补0补成6位),然后判断该 6 位数字的前三位数字之和与后三位数字之和是否相等。很显然需要做两步事情。

2.补全6位: 因此我想到用**String.format("%06d", N)**将该整数格式化为 6 位字符串。

3.提取数字: 这一步就与之前的分离数位做法一致,通过num % 10获取各个位数上的数字。

**4.判断输出:**对提取出的前三位和后三位使用判断语句,并输出相应解答。

涉及知识点:

1.String.format()

基础概念

String.format()是 Java 中 String 类的一个静态方法,用于格式化字符串的强大方法,类似于 C 语言的 printf()。它允许通过占位符动态生成格式化的字符串。它的基本语法如下:

复制代码
public static String format(String format, Object... args)
  • format:这是一个格式字符串,它包含普通字符和格式说明符。普通字符会按原样输出,而格式说明符用于指定如何格式化后面的参数。
  • args:这是一个可变参数列表,包含要插入到格式字符串中的值。
使用方法

以下是一个简单的示例,展示了如何使用 String.format 格式化字符串:

复制代码
public class StringFormatExample {
    public static void main(String[] args) {
        String name = "John";
        int age = 30;
        String message = String.format("My name is %s and 
                I am %d years old.", name, age);
        System.out.println(message);
    }

在这个示例中,%s 是字符串格式说明符,用于格式化 name 变量;%d 是整数格式说明符,用于格式化 age 变量。

指定参数索引

可以使用 argument_index$ 来指定要格式化的参数的索引:

复制代码
public class StringFormatIndexExample {
    public static void main(String[] args) {
        String name = "John";
        int age = 30;
        String message = String.format("My name is %2$s and 
            I am %1$d years old.", age, name);
        System.out.println(message);
    }
}

在这个示例中,%2$s 表示使用第二个参数(即 name)进行字符串格式化,%1$d 表示使用第一个参数(即 age)进行整数格式化。

使用标志和宽度

可以使用标志和宽度来控制格式化的输出:

复制代码
public class StringFormatFlagsExample {
    public static void main(String[] args) {
        int number = 123;
        String formatted = String.format("%08d", number);
        System.out.println(formatted);
    }
}

在这个示例中,%08d 表示使用零填充,总宽度为 8 位的整数格式化。

在本题中,我们即使用了该方法,String str=String.format("%06d",N);表示使用0填充,总宽度为6。

常见实践
1.格式化日期和时间

可以使用 String.format 来格式化日期和时间:

复制代码
import java.util.Date;
 
public class StringFormatDateExample {
    public static void main(String[] args) {
        Date now = new Date();
        String formattedDate = String.format("Today is %tF", now);
        System.out.println(formattedDate);
    }
}

在这个示例中,%tF 是日期格式说明符,用于以 YYYY-MM-DD 的格式输出日期。

2.格式化浮点数

可以使用 String.format 来格式化浮点数:

复制代码
public class StringFormatFloatExample {
    public static void main(String[] args) {
        double pi = Math.PI;
        String formattedPi = String.format("Pi is approximately %.2f", pi);
        System.out.println(formattedPi);
    }
}

在这个示例中,%.2f 表示保留两位小数的浮点数格式化。

最佳实践
1.提高代码可读性

使用 String.format 可以提高代码的可读性,尤其是在需要拼接多个变量的情况下。例如:

复制代码
public class StringFormatReadabilityExample {
    public static void main(String[] args) {
        String city = "New York";
        int population = 8500000;
        String info = String.format("The city of %s has 
                a population of %d.", city, population);
        System.out.println(info);
    }
}
2.避免字符串拼接

在需要拼接大量字符串时,使用 String.format 可以避免频繁的字符串拼接操作,提高性能。例如:

复制代码
public class StringFormatPerformanceExample {
    public static void main(String[] args) {
        String[] words = {"Hello", "World", "!"};
        String message = String.format("%s %s %s", words[0], words[1], words[2]);
        System.out.println(message);
    }
}

04.横竖切蛋糕【新生编程赛】

完整解题代码:

复制代码
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();
        int x=N/2;
        int y=N-x;
        int sum=(x+1)*(y+1);
        System.out.println(sum);
        scan.close();
    }
}

解题思路:

**1.明确目标:**根据可切的🔪数,判断切出的最大蛋糕数,第一反应又可以把他看作一个数学分析的题目。

**2.仔细分析:**易得用数学"和定积最大" 的规律(均值不等式证明):即当两个数的和固定时,它们的差越小,乘积越大。即横竖切最接近时,切出的蛋糕数量最多。

(高中回忆杀。。。。。。。)

**3.拆分输出:**将N分为差最小的两数,相乘即得最大块数。

05.贴上羽毛【新生编程赛】

完整代码解析:

复制代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int x = scan.nextInt();
        int y = scan.nextInt();
        int z = scan.nextInt();
        
        int sum = x + y + z; 
        int max = Math.max(x, Math.max(y, z));
        
        int k = max;
        while (true) {
            int diff = 3 * k - sum; 
            if (diff >= 0 && diff % 2 == 0) {
                System.out.println(diff / 2); 
                break;
            }
            k++; 
        }
        scan.close();
    }
}

解题思路:

1.明确目标: 有三只鸡,羽毛数分别为xyz。可执行两种操作,要求计算让三只鸡羽毛数相同所需的最少操作次数。看起来又像个数学题。

**2.继续分析:**要让三只鸡羽毛数最终相同,设最终每只鸡的羽毛数为k,需满足以下两个逻辑:

  • k至少是xyz中的最大值;
  • 总羽毛数需满足 3k = 初始总羽毛数 + 2×操作次数(因为每次操作总羽毛数增加 2)。

**3.解题步骤:**因此解题步骤便清晰了,首先计算初始总羽毛数sum = x + y + z;然后从max(x,y,z)开始,遍历循环尝试k,找到满足3k ≥ sum3k - sum为正偶数的最小k。

**4.输出操作:**最后输出操作次数为 (3k - sum) / 2

相关推荐
LayZhangStrive1 小时前
融360 一面
java·面试·后端开发
学习中.........2 小时前
Karpathy nanoGPT 教程到底讲了什么
人工智能·算法·语言模型
城管不管2 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
Java小白笔记2 小时前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程
爱敲键盘的猴子2 小时前
深入理解 Java HashMap
java·hashmap
霸道流氓气质2 小时前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
天涯醉青楼2 小时前
Spring Boot 接口返回 Bean 时字段名“变形”的深度剖析与解决方案
java
步行cgn2 小时前
MyBatis 高级映射与延迟加载完全指南
java·tomcat·mybatis
thefool1122662 小时前
从中序与后序遍历序列构造二叉树
java
吴声子夜歌3 小时前
Java面试题——JVM(二)
java·开发语言·jvm