【笔试强化】Day 5

文章目录

  • 一、单选
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
  • 二、不定项选择
    • 1.
  • 三、编程
    • 1. 统计回文
      • 题解:
      • 代码:
    • 2. 连续最大和
      • 题目解析:
        • 1. 状态表示:
        • 2. 状态转移方程
        • 3. 初始化
        • 4. 填表顺序
        • 5. 返回值
      • 代码:

一、单选

1.

【笔试强化】Day 5_第1张图片

正确答案:A

2.

【笔试强化】Day 5_第2张图片
【笔试强化】Day 5_第3张图片

正确答案:C

x.append 就变成了 AB
x 修改了引用
y 修改的是对象,对本身并不发生改变

3.

【笔试强化】Day 5_第4张图片

正确答案:B

this. 的是其他的普通方法和成员变量

4.

【笔试强化】Day 5_第5张图片

正确答案:C

没有初始化

5.

【笔试强化】Day 5_第6张图片

正确答案:D

6.

在这里插入图片描述
【笔试强化】Day 5_第7张图片

正确答案:C

7.

【笔试强化】Day 5_第8张图片

正确答案:B

8.

【笔试强化】Day 5_第9张图片

正确答案:C

9.

在这里插入图片描述
【笔试强化】Day 5_第10张图片

正确答案:B

str 改变的是形参的指向,原来不会改变
ch 修改的是地址,原来会改变

二、不定项选择

1.

【笔试强化】Day 5_第11张图片

正确答案:A,B,D

C:是不可重写

三、编程

1. 统计回文

【笔试强化】Day 5_第12张图片
原题链接


题解:

遍历 A,将 B insert进入 A 的每个位置,判断是否是回文

这里注意的是,判断回文的时候,直接将字符串逆置,看是否相同就好了

需要注意的是这里不能 A.insert(i, B),这样的话 A 改变了,判断下一个位置就不对了

所以每次使用 A 重新给一个str,然后str.insert(i, B),再判断。


代码:

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String A = sc.nextLine();
        String B = sc.nextLine();

        int ret = 0;
        for(int i = 0; i <= A.length(); i++) {
            StringBuilder s = new StringBuilder(A);
            s.insert(i,B);
            StringBuilder tmp = new StringBuilder(s);
            StringBuilder s1 = tmp.reverse();
            if(s.toString().equals(s1.toString())) {
                ret++;
            }
        }
        System.out.println(ret); 
    }
}

【笔试强化】Day 5_第13张图片


2. 连续最大和

【笔试强化】Day 5_第14张图片
原题链接


题目解析:

1. 状态表示:

dp[i] 表示:以 i 位置元素为结尾的所有子数组的最大和

2. 状态转移方程

dp[i] 的所有可能可以分为以下两种:

  1. 子数组的长度为 1 :此时 dp[i] = nums[i]
  2. 子数组的长度大于 1 :此时 dp[i] 应该等于以 i - 1 做结尾的「所有子数组」中和的最⼤值再加上 nums[i]
    也就是 dp[i - 1] + nums[i]

由于我们要的是「最大值」,因此应该是两种情况下的最大值,因此可得转移方程:

dp[i] = max(nums[i], dp[i - 1] + nums[i])

3. 初始化

可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化

  • 辅助结点里面的值要「保证后续填表是正确的」
  • 「下标的映射关系」

「最前⾯加上⼀个格子,并且让 dp[0] = 0

4. 填表顺序

从左往右

5. 返回值

返回整个 dp 表中的最大值

代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n+1];
        dp[0] = 0;
        int ret = Integer.MIN_VALUE;
        for(int i = 1; i <= n; i++) {
            dp[i] = Math.max(nums[i-1], dp[i-1] + nums[i-1]);
            ret = Math.max(ret,dp[i]);
        }
        return ret;
    }
}

【笔试强化】Day 5_第15张图片

你可能感兴趣的:(笔试强化,java,算法)