备战秋招013(20230809)

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、动态规划
    • 1.完全背包问题
    • 2.题目
  • 三、牛客网华为机试
    • 1、简介
    • 2、ACM
    • 2、题目
  • 三、SQL
    • 1、增删改部分
  • 总结


前言

提示:这里为每天自己的学习内容心情总结;

Learn By Doing,Now or Never,Writing is organized thinking.


提示:以下是本篇文章正文内容

一、今天学习了什么?

  • 代码随想录的动态规划部分;
  • 牛客网的华为机试

二、动态规划

1.完全背包问题

**「完全背包问题」 ** 是指,有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

完全背包和01背包问题唯一不同的地方就是,每种物品有无限件

    /**
     * 完全背包问题,物品可以重复使用
     * - 由于可以重复使用,所以每次都可以从第一个物品开始判断
     */
    public static int testCompletePack(int[] weight, int[] value, int bagSize) {
        int[] dp = new int[bagSize + 1];

        for (int i = bagSize; i >= weight[0]; i--) {
            dp[i] = value[0];
        }

        for (int i = 0; i < weight.length; i++) {
            for (int j = weight[i]; j <= bagSize; j++) {
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
            }
        }
        return dp[bagSize];
    }

2.题目

  • 494. 目标和(⭐⭐⭐⭐⭐)
    public int findTargetSumWays(int[] nums, int target) {
        /**
         * - 首先求出整个数组中的所有元素之和sum
         * - 可以看成将整个数组分为两部分,A和B,那么满足下面的数学关系式:
         *  A+B=sum,A-B=target
         *  那么我们只需要求出采用数组中的元素拼凑出来和为 (sum+target)/2的方法有多少
         *  - QQQ:如何看成是一个背包问题呢?
         *  - - 物品重量和价值数组都是nums,背包的所能背的容量为sum+target)/2,dp【i】代表背包价值为i时的方法数
         */
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }

        if (target < 0 && sum < -target) return 0;
        if ((sum + target) % 2 != 0) {
            return 0;
        }
        sum = (sum + target) / 2;
        if (sum < 0) {
            sum = -sum;
        }

        int[] dp = new int[sum + 1];
        dp[0] = 1;

        for (int i = 0; i < nums.length; i++) {
            for (int j = sum; j >= nums[i]; j--) {
                dp[j] += dp[j - nums[i]];
            }
        }

        return dp[sum];
    }
  • 474. 一和零
    public int findMaxForm(String[] strs, int m, int n) {

        /**
         * - 动态规划的背包问题,选和不选对结果的影响,dp数组含义是什么呢?
         * - 这个子集中最多能有m个0和n个1
         * - dp[i][j],代表子集中最多有i个0和j个1时的最大子集的长度
         */
        int[][] dp = new int[m + 1][n + 1];
        for (int index = 0; index < strs.length; index++) {
            int[] countZeroAndOne = countZeroAndOne(strs[index]);
            int zero = countZeroAndOne[0];
            int one = countZeroAndOne[1];
            // 遍历dp数组
            for (int i = m; i >= zero; i--) {
                for (int j = n; j >= one; j--) {
                    dp[i][j] = Math.max(dp[i][j], dp[i - zero][j - one] + 1);
                }
            }
        }

        return dp[m][n];
    }

    /**
     * 写一个函数,计算出来字符串的0和1的个数
     */
    private int[] countZeroAndOne(String s) {
        int[] res = new int[2];

        int zero = 0;
        int one = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '0') {
                zero++;
            } else {
                one++;
            }
        }
        res[0] = zero;
        res[1] = one;

        return res;
    }
  • 518. 零钱兑换 II
    public int change(int amount, int[] coins) {
        /**
         * - 凑硬币的个数,完全背包问题
         * - dp[i]代表凑出总金额为i的硬币组合数
         */
        int[] dp = new int[amount + 1];
        dp[0] = 1;

        for (int i = 0; i < coins.length; i++) {
            for (int j = coins[i]; j <= amount; j++) {
                dp[j] += dp[j - coins[i]];
            }
        }

        return dp[amount];
    }


三、牛客网华为机试



1、简介


参考的是牛客网 华为机试 的内容,进行代码实现的。


2、ACM


对于传统ACM的OJ模式题目,你的程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果。

ACM(OJ)模式下对于各种输入输出情况的总结(JAVA);

注意类名必须为Main, 不要有任何package xxx信息

首先对与Java的输入,要用[ Scanner ]:

Scanner in = new Scanner(System.in);

读取字符或行:

in.hasNext(); // 字符
in.hasNextLine(); // 行

采用has xxxx的话,后面也要用next xxxx。比如前面用hasNextLine,那么后面要用 nextLine 来处理输入。



2、题目



  • HJ1 字符串最后一个单词的长度
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String s =in.nextLine();
        String[] arr = s.split(" ");
        System.out.println(arr[arr.length - 1].length());
    }
  • HJ2 计算某字符出现次数
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        String s2 = in.nextLine();
        s1 = s1.toLowerCase();
        s2 = s2.toLowerCase();
        int res = 0;
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) == s2.toCharArray()[0]) {
                res++;
            }
        }
        System.out.println(res);
    }
  • HJ3 明明的随机数
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int length = in.nextInt();
        // 注意 hasNext 和 hasNextLine 的区别
        TreeSet<Integer> set = new TreeSet();
        for (int i = 0; i < length; i++) { // 注意 while 处理多个 case
            int a = in.nextInt();
            set.add(a);
        }
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
  • HJ4 字符串分隔
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String s = in.nextLine();
            StringBuilder sb = new StringBuilder();
            sb.append(s);
            int length = sb.length();
            int addZero = 8 - length % 8;
            while (addZero > 0 && addZero < 8) {
                sb.append('0');
                addZero--;
            }
            String string = sb.toString();
            while (string.length() > 0) {
                System.out.println(string.substring(0, 8));
                string = string.substring(8);
            }
        }
    }
  • HJ5 进制转换
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String line = in.nextLine();
            int ans = 0;
            int length = line.length();
            // 从右到左
            for (int i = length - 1; i >= 0; i--) {
                char c = line.charAt(i);
                int b = 0;
                if (c == 'x' || c == 'X') {
                    System.out.println(ans);
                    break;
                } else if (c >= 'A' && c <= 'F') {
                    b = c - 'A' + 10;
                } else {
                    b = c - '0';
                }
                ans += (int) Math.pow(16, length - i - 1) * b;
            }
        }
    }

三、SQL

该部分的内容是参考牛客网的 SQL进阶挑战,总共含有 6 部分的内容如下所示,


1、增删改部分


「增删改操作」部分如下

  • SQL110 插入记录(一)
INSERT INTO exam_record (uid, exam_id, start_time, submit_time, score) VALUES
(1001, 9001, '2021-09-01 22:11:12', '2021-09-01 23:01:12', 90),
(1002, 9002, '2021-09-04 07:01:02', NULL, NULL);
  • SQL111 插入记录(二)
INSERT INTO exam_record_before_2021(uid, exam_id, start_time, submit_time, score)
SELECT uid, exam_id, start_time, submit_time, score
FROM exam_record
WHERE YEAR(submit_time) < '2021';
  • SQL112 插入记录(三)
DELETE FROM examination_info
WHERE exam_id=9003;
INSERT INTO examination_info
VALUES(NULL,9003, 'SQL','hard', 90, '2021-01-01 00:00:00')
  • SQL113 更新记录(一)
update examination_info
set tag = 'Python' where tag = 'PYTHON';
  • SQL114 更新记录(二)
UPDATE exam_record
SET submit_time='2099-01-01 00:00:00', score=0
WHERE start_time < '2021-09-01 00:00:00' AND score IS NULL;

总结

提示:这里对文章进行总结:

你可能感兴趣的:(秋招打卡,java)