【笔试强化】Day 9

一、单选

1.

在这里插入图片描述
转换成大写之后,是 new 了一个新的字符串

正确答案:D

2.

在这里插入图片描述
B:子类继承父类,重写父类方法

正确答案:C

3.

在这里插入图片描述
A:new 出来的对象都是分配在堆上的

正确答案:D

4.

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

正确答案:C

5.

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

正确答案:B

6.

在这里插入图片描述

正确答案:A

7.

在这里插入图片描述
在这里插入图片描述在 new Employee 的时候,需要调用有参的构造函数
又因为是 Person 的子类,所以要先调用父类的构造函数
但是没有用 super,这个是会编译报错的

正确答案:C

8.

在这里插入图片描述
无论new 多少个该类的示例,static 方法只有一份,属于类本身

正确答案:F

9.

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

正确答案:B

10.

在这里插入图片描述
在判断相等的时候,进行了自动拆箱

正确答案:B

二、编程

1. 另类加法

在这里插入图片描述
原题链接


解法:

(1)二进制位 异或 的结果,是两个数对应位相加的结果(不考虑进位)
1 = 0001
2 = 0010
1 ^ 2 = 0011

(1)二进制位 与 后 左移一位 的结果,是两个数相加进位后的结果(只考虑进位)
1 = 0001
2 = 0010
(1 ^ 2) << 1 = 0000

因此这道题就循环,两位相加,然后再看 B 是否为 0


代码:

public class UnusualAdd {
    public int addAB(int A, int B) {
        if(B == 0) {
            return A;
        }
        int sum = 0;
        int carray = 0;
        while(B != 0) {
            sum = A ^ B;
            carray = (A & B) << 1;
            A = sum;
            B = carray;
        }
        return A;
    }
}

在这里插入图片描述


2. 走方格的方案数

在这里插入图片描述
原题链接


解法:

1. 使用动态规划

这个和之前写过的不同路径问题很像
不同路径的算法解析

但是这个需要注意一个地方,就是 沿棋盘格之间的边缘线行走
这就需要再初始化的时候,最外边的一行和一列都是 1


代码:
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();

        int[][] dp = new int[n+1][m+1];
        for(int i = 0; i <= n; i++) {
            dp[i][0] = 1;
        }
        for(int i = 0; i <= m; i++) {
            dp[0][i] = 1;
        }
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        System.out.println(dp[n][m]);
    }
}

在这里插入图片描述

2. 递归

这里我们可以分为两种情况

情况一:
如果n或者m为1,则只有一行或者一列,从左上角走到右下角的路径数为n + m
在这里插入图片描述

情况二:
如果n,m都大于1,那么走到[n][m]格子的右下角只有两条路径
<1>: 从[n - 1][m]格子的右下角向下走,到达
<2>: 从[n][m - 1]格子的右下角向右走,到达

在这里插入图片描述


代码:
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int m = in.nextInt();

            System.out.println(med(n, m));
        }
    }
    public static int med(int n, int m) {
        if(n == 1 && m >= 1 || m == 1 && n >= 1) {
            return n + m;
        }

        return med(n-1, m) + med(n, m-1);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柒柒要开心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值