代码随想录-Day41

46. 携带研究材料(第六期模拟笔试)在这里插入图片描述

题目描述
小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。

小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

输入描述
第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。

第二行包含 M 个正整数,代表每种研究材料的所占空间。

第三行包含 M 个正整数,代表每种研究材料的价值。

输出描述
输出一个整数,代表小明能够携带的研究材料的最大价值。
输入示例
6 1
2 2 3 1 5 2
2 3 1 5 4 3
输出示例
5
提示信息
小明能够携带 6 种研究材料,但是行李空间只有 1,而占用空间为 1 的研究材料价值为 5,所以最终答案输出 5。

数据范围:
1 <= N <= 5000
1 <= M <= 5000
研究材料占用空间和价值都小于等于 1000

方法一:

public class BagProblem {
    public static void main(String[] args) {
        int[] weight = {1,3,4};
        int[] value = {15,20,30};
        int bagSize = 4;
        testWeightBagProblem(weight,value,bagSize);
    }

    /**
     * 动态规划获得结果
     * @param weight  物品的重量
     * @param value   物品的价值
     * @param bagSize 背包的容量
     */
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        // 创建dp数组
        int goods = weight.length;  // 获取物品的数量
        int[][] dp = new int[goods][bagSize + 1];

        // 初始化dp数组
        // 创建数组后,其中默认的值就是0
        for (int j = weight[0]; j <= bagSize; j++) {
            dp[0][j] = value[0];
        }

        // 填充dp数组
        for (int i = 1; i < weight.length; i++) {
            for (int j = 1; j <= bagSize; j++) {
                if (j < weight[i]) {
                    /**
                     * 当前背包的容量都没有当前物品i大的时候,是不放物品i的
                     * 那么前i-1个物品能放下的最大价值就是当前情况的最大价值
                     */
                    dp[i][j] = dp[i-1][j];
                } else {
                    /**
                     * 当前背包的容量可以放下物品i
                     * 那么此时分两种情况:
                     *    1、不放物品i
                     *    2、放物品i
                     * 比较这两种情况下,哪种背包中物品的最大价值最大
                     */
                    dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i]);
                }
            }
        }

        // 打印dp数组
        for (int i = 0; i < goods; i++) {
            for (int j = 0; j <= bagSize; j++) {
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println("\n");
        }
    }
}

这段Java代码实现了一个基于动态规划(Dynamic Programming, DP)的方法来解决经典的“0-1背包问题”。0-1背包问题是指有一个背包,最大承重为bagSize,同时有goods件物品,每件物品都有自己的重量weight[i]和价值value[i]。目标是确定每件物品放或不放的选择方案,使得放入背包的物品总价值最大,同时不超过背包的承重限制。

解析

  1. 初始化DP数组:

    • dp[i][j]表示在只考虑前i件物品的情况下,当背包容量为j时能装入物品的最大总价值。
    • 初始化第一行时,考虑的是只有第一件物品时的情况,因此当背包容量大于等于第一件物品的重量时,可以选择放入该物品,dp[0][j] = value[0]
  2. 填充DP数组:

    • 外层循环遍历所有物品。
    • 内层循环遍历从0到背包最大容量bagSize的所有可能容量。
    • 对于每个dp[i][j],有两种选择:
      • 不放入第i件物品,此时的最大价值等于前i-1件物品在容量为j时的最大价值,即dp[i-1][j]
      • 如果放入第i件物品(前提是当前背包容量j大于等于第i件物品的重量weight[i]),则需要从背包剩余容量中减去当前物品的重量,查看剩余容量下的最大价值,即dp[i-1][j-weight[i]] + value[i],然后与不放该物品的情况比较取最大值。
  3. 打印DP数组:

    • 最后,通过双层循环遍历并打印出整个dp数组,帮助我们直观地理解每一步决策过程及最终结果。

结果

虽然代码中包含了打印dp数组的过程以供观察,但实际应用中,我们通常只关心最终结果,即dp[goods-1][bagSize],它表示在考虑所有物品和背包容量限制下能够获取的最大价值。不过,这段代码未直接输出这个结果,如果你需要看到具体的最优解,可以在打印数组之后添加一行代码输出dp[goods-1][bagSize]

方法二:

import java.util.Arrays;

public class BagProblem {
    public static void main(String[] args) {
        int[] weight = {1,3,4};
        int[] value = {15,20,30};
        int bagSize = 4;
        testWeightBagProblem(weight,value,bagSize);
    }

    /**
     * 初始化 dp 数组做了简化(给物品增加冗余维)。这样初始化dp数组,默认全为0即可。
     * dp[i][j] 表示从下标为[0 - i-1]的物品里任意取,放进容量为j的背包,价值总和最大是多少。
     * 其实是模仿背包重量从 0 开始,背包容量 j 为 0 的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为 0。
     * 可选物品也可以从无开始,也就是没有物品可选,即dp[0][j],这样无论背包容量为多少,背包价值总和一定为 0。
     * @param weight  物品的重量
     * @param value   物品的价值
     * @param bagSize 背包的容量
     */
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        // 创建dp数组
        int goods = weight.length;  // 获取物品的数量
        int[][] dp = new int[goods + 1][bagSize + 1];  // 给物品增加冗余维,i = 0 表示没有物品可选

        // 初始化dp数组,默认全为0即可
        // 填充dp数组
        for (int i = 1; i <= goods; i++) {
            for (int j = 1; j <= bagSize; j++) {
                if (j < weight[i - 1]) {  // i - 1 对应物品 i
                    /**
                     * 当前背包的容量都没有当前物品i大的时候,是不放物品i的
                     * 那么前i-1个物品能放下的最大价值就是当前情况的最大价值
                     */
                    dp[i][j] = dp[i - 1][j];
                } else {
                    /**
                     * 当前背包的容量可以放下物品i
                     * 那么此时分两种情况:
                     *    1、不放物品i
                     *    2、放物品i
                     * 比较这两种情况下,哪种背包中物品的最大价值最大
                     */
                    dp[i][j] = Math.max(dp[i - 1][j] , dp[i - 1][j - weight[i - 1]] + value[i - 1]);  // i - 1 对应物品 i
                }
            }
        }

        // 打印dp数组
        for(int[] arr : dp){
            System.out.println(Arrays.toString(arr));
        }
    }
}

这段代码是使用Java实现的解决0-1背包问题的改进版本,通过动态规划(Dynamic Programming, DP)方法计算在给定背包容量和每件物品的重量、价值的情况下,能够获取的最大价值。相比之前的版本,这里的实现做了些微调和优化,特别是对动态规划数组的初始化进行了简化,并在代码中增加了详细的注释来解释每一步的操作。下面是代码的详细解析:

代码解析

  1. 初始化改进:在定义dp数组时,增加了一个冗余维度,使得物品编号从1到goods对应于数组下标0到goods-1,这样的好处是在计算时不需要特别处理边界情况,直接遍历即可,简化了逻辑。dp[i][j]的含义是考虑前i件物品,背包容量为j时的最大价值。

  2. 简化初始化:由于dp数组被初始化为全0,这已经符合了动态规划的初始条件——即没有物品可选或背包容量为0时,价值总和为0。因此,去除了显式的初始化步骤,直接进入填充阶段。

  3. 填充DP数组

    • 双重循环遍历每一件物品和每一个可能的背包容量。对于每个状态dp[i][j]
      • 若当前背包容量j不足以容纳第i件物品(即j < weight[i-1]),则不选第i件物品,价值继承自不选此物品的最大价值,即dp[i][j] = dp[i-1][j]
      • 若背包容量足够,需要在不选第i件物品(价值dp[i-1][j])和选择第i件物品(价值dp[i-1][j-weight[i-1]] + value[i-1])中取最大值,以最大化背包总价值。
  4. 打印结果:最后,通过遍历并打印dp数组,可以直观地查看每一步动态规划的决策过程,虽然在实际应用中可能并不需要打印,但有助于理解和调试。

结果分析

代码执行后,dp[goods][bagSize]即为所能获取的最大价值。不过,需要注意的是,代码最后打印的是整个dp数组的状态,而不是直接输出最大价值。如果需要直接获取并打印最大价值,可以在循环结束后添加一行代码,如System.out.println(dp[goods][bagSize]);

方法三:

在这里插入图片描述

    public static void main(String[] args) {
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagWight = 4;
        testWeightBagProblem(weight, value, bagWight);
    }

    public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){
        int wLen = weight.length;
        //定义dp数组:dp[j]表示背包容量为j时,能获得的最大价值
        int[] dp = new int[bagWeight + 1];
        //遍历顺序:先遍历物品,再遍历背包容量
        for (int i = 0; i < wLen; i++){
            for (int j = bagWeight; j >= weight[i]; j--){
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
            }
        }
        //打印dp数组
        for (int j = 0; j <= bagWeight; j++){
            System.out.print(dp[j] + " ");
        }
    }

这段Java代码实现了一个简化版的0-1背包问题的动态规划解法。0-1背包问题的目标是:给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,选取哪些物品可以使得总价值最大。下面是对这段代码的详细解析:

主函数

  • 定义了物品的重量数组weight、价值数组value以及背包的最大承重bagWeight
  • 调用testWeightBagProblem方法求解最大价值。

testWeightBagProblem 方法

  1. 初始化:首先获取物品的数量wLen,并定义一个长度为bagWeight + 1的数组dpdp[j]表示当背包容量为j时,能够装入物品的最大总价值。

  2. 双重循环

    • 外层循环遍历每个物品(从0到wLen-1)。
    • 内层循环从背包的最大容量bagWeight反向遍历到当前物品的重量。这样的遍历顺序保证了在计算dp[j]时,已经处理了所有比当前物品轻的物品,利用了之前计算的结果,体现了动态规划的“状态转移”。
  3. 状态转移方程:在内层循环中,对于每个背包容量j,有两种选择:

    • 不放入第i件物品,此时背包的最大价值保持不变,即dp[j] = dp[j]
    • 放入第i件物品,背包的当前容量减去该物品的重量j - weight[i],背包的最大价值变为之前的最大价值加上当前物品的价值,即dp[j - weight[i]] + value[i]
    • 使用Math.max()函数选择这两种情况中的较大值作为新的dp[j],表示在考虑放入第i个物品后,容量为j的背包能够达到的最大价值。
  4. 打印结果:最后,代码遍历并打印dp数组,展示在不同背包容量下能够达到的最大价值。

注意点

  • 这个版本的代码通过逆序遍历背包容量,避免了需要初始化第一排和第一列的麻烦,直接从空背包(容量为0)开始计算,逐渐增加背包容量。
  • 由于是从大到小遍历背包容量,所以在考虑放入当前物品时,之前容量较小的情况已经计算完成,可以直接利用,保证了动态规划的“从已知求未知”的原则。

416. 分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:

1 <= nums.length <= 200
1 <= nums[i] <= 100

方法一:

class Solution {
    public boolean canPartition(int[] nums) {
        if(nums == null || nums.length == 0) return false;
        int n = nums.length;
        int sum = 0;
        for(int num : nums) {
            sum += num;
        }
        //总和为奇数,不能平分
        if(sum % 2 != 0) return false;
        int target = sum / 2;
        int[] dp = new int[target + 1];
        for(int i = 0; i < n; i++) {
            for(int j = target; j >= nums[i]; j--) {
                //物品 i 的重量是 nums[i],其价值也是 nums[i]
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }
           
            //剪枝一下,每一次完成內層的for-loop,立即檢查是否dp[target] == target,優化時間複雜度(26ms -> 20ms)
            if(dp[target] == target)
                return true;
        }
        return dp[target] == target;
    }
}

这段Java代码是用于解决“零钱兑换II”或类似问题的一个变种,准确地说,是判断一个整数数组nums中的元素是否可以分成两个子集,使得这两个子集的和相等。这是一种完全背包问题的变体,用于判断是否存在子集和为总和一半的情况。以下是代码的详细解析:

方法概览

  • 输入:一个整数数组nums
  • 输出:如果可以将数组分割成两个总和相等的子集,则返回true,否则返回false

核心逻辑

  1. 检查特殊情况:首先,检查数组是否为空或长度为0,若是,则直接返回false,因为不可能分割。
  2. 计算总和:计算数组元素的总和sum,如果sum是奇数,则直接返回false,因为不能平均分配。
  3. 目标值:设置目标值target为总和的一半。
  4. 初始化动态规划数组:创建一个长度为target + 1的数组dp,用于存储达到每个目标和的可能性。初始化所有值为0,因为一开始没有任何物品被选中。
  5. 填充动态规划数组:双层循环遍历每个物品和每个可能的目标和值。从数组中的每个元素开始,反向遍历到目标值,更新dp[j]max(dp[j], dp[j - nums[i]] + nums[i])。这一步是在考虑是否选择当前物品nums[i]以达到或更接近目标和j
  6. 剪枝优化:在内层循环结束后,检查是否已经找到了和为目标值的子集(dp[target] == target),如果是,则提前返回true,避免不必要的循环。
  7. 返回结果:最后,检查dp[target]是否等于target,如果等于则说明找到了满足条件的子集,返回true;否则返回false

性能优化

  • 剪枝:通过在内层循环结束后进行检查,一旦发现已达到目标和,就提前终止循环,这是一种有效的剪枝策略,可以减少不必要的计算,提高程序运行效率。

总的来说,这个方法通过动态规划有效地解决了能否将数组分割成两个和相等的子集的问题,同时通过剪枝策略进行了优化。

方法二 :二维数组版本(易于理解)

public class Solution {
    public static void main(String[] args) {
        int num[] = {1,5,11,5};
        canPartition(num);

    }
    public static boolean canPartition(int[] nums) {
        int len = nums.length;
        // 题目已经说非空数组,可以不做非空判断
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        // 特判:如果是奇数,就不符合要求
        if ((sum %2 ) != 0) {
            return false;
        }

        int target = sum / 2; //目标背包容量
        // 创建二维状态数组,行:物品索引,列:容量(包括 0)
        /*
        dp[i][j]表示从数组的 [0, i] 这个子区间内挑选一些正整数
          每个数只能用一次,使得这些数的和恰好等于 j。
        */
        boolean[][] dp = new boolean[len][target + 1];

        // 先填表格第 0 行,第 1 个数只能让容积为它自己的背包恰好装满  (这里的dp[][]数组的含义就是“恰好”,所以就算容积比它大的也不要)
        if (nums[0] <= target) {
            dp[0][nums[0]] = true;
        }
        // 再填表格后面几行
        //外层遍历物品
        for (int i = 1; i < len; i++) {
            //内层遍历背包
            for (int j = 0; j <= target; j++) {
                // 直接从上一行先把结果抄下来,然后再修正
                dp[i][j] = dp[i - 1][j];

                //如果某个物品单独的重量恰好就等于背包的重量,那么也是满足dp数组的定义的
                if (nums[i] == j) {
                    dp[i][j] = true;
                    continue;
                }
                //如果某个物品的重量小于j,那就可以看该物品是否放入背包
                //dp[i - 1][j]表示该物品不放入背包,如果在 [0, i - 1] 这个子区间内已经有一部分元素,使得它们的和为 j ,那么 dp[i][j] = true;
                //dp[i - 1][j - nums[i]]表示该物品放入背包。如果在 [0, i - 1] 这个子区间内就得找到一部分元素,使得它们的和为 j - nums[i]。
                if (nums[i] < j) {
                    dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]];
                }
            }
        }
        for (int i = 0; i < len; i++) {
            for (int j = 0; j <= target; j++) {
                System.out.print(dp[i][j]+" ");
            }
            System.out.println();
        }
        return dp[len - 1][target];
    }
}
//dp数组的打印结果
false true false false false false false false false false false false 
false true false false false true true false false false false false 
false true false false false true true false false false false true 
false true false false false true true false false false true true 

这段Java代码实现了求解“分割等和子集”问题的动态规划算法。给定一个非空数组nums,判断是否可以将其分割成两个子集,使得两个子集的和相等。以下是代码的详细解析:

主要逻辑

  1. 初始化:首先,计算数组的总和sum,并检查总和是否为偶数。如果是奇数,则直接返回false,因为无法分割成两个和相等的子集。接着,设定目标和target为总和的一半。

  2. 创建DP数组:定义一个布尔类型的二维数组dp,其中dp[i][j]表示在前i个元素中是否存在一些元素的和等于j。数组的大小是len(数组长度)乘以target + 1,初始化为false

  3. 初始化DP数组的第一行:如果数组的第一个元素不大于目标和target,则dp[0][nums[0]]置为true,表示可以恰好装满容量为nums[0]的背包。

  4. 填充DP数组:通过两层循环遍历每个物品和每个可能的目标和。对于每个元素,有两种情况考虑:

    • 如果当前物品的值等于当前的容量j,那么可以单独装入背包,dp[i][j] = true
    • 如果当前物品的值小于当前的容量j,那么有两种选择:不选当前物品(继承上一行相同容量的状态dp[i-1][j])或者选当前物品(查看剩余容量j-nums[i]在上一行是否可以被满足,即dp[i-1][j-nums[i]])。如果这两种情况有任何一种为真,则dp[i][j] = true
  5. 输出和返回结果:最后,打印整个dp数组(用于调试查看状态转移过程),并返回dp[len - 1][target],即判断数组最后一个元素对应的背包容量target是否可以被满足。

输出解释

打印的dp数组展示了动态规划过程中每个状态的真假值,其中true表示存在一个子集的和等于当前列索引所表示的值。最后一行的最后一个元素(即dp[len - 1][target])为true,表明原数组可以分割成两个和为target的子集。

综上所述,这段代码有效地利用动态规划求解了“分割等和子集”问题。

方法三:二维数组整数版本

class Solution {
    public boolean canPartition(int[] nums) {
        //using 2-D DP array.
        int len = nums.length;
        //check edge cases;
        if(len == 0)
            return false;

        int sum = 0;
        for (int num : nums)
            sum += num;
        //we only deal with even numbers. If sum is odd, return false;
        if(sum % 2 == 1)
            return false;
        
        int target = sum / 2;
        int[][] dp = new int[nums.length][target + 1];

        // for(int j = 0; j <= target; j++){
        //     if(j < nums[0])
        //         dp[0][j] = 0;
        //     else
        //         dp[0][j] = nums[0];
        // }

        //initialize dp array
        for(int j = nums[0]; j <= target; j++){
            dp[0][j] = nums[0];
        }

        for(int i = 1; i < len; i++){
            for(int j = 0; j <= target; j++){
                if (j < nums[i]) 
                    dp[i][j] = dp[i - 1][j];
                else 
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);
            }
        }

        //print out DP array
        // for(int x : dp){
        //     System.out.print(x + ",");
        // }
        // System.out.print("    "+i+" row"+"\n");
        return dp[len - 1][target] == target;
    }
}
//dp数组的打印结果 for test case 1.
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 6, 6, 
0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 6, 11, 
0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 10, 11, 

这段Java代码实现了解决“分割等和子集”问题的动态规划算法。给定一个非空整数数组nums,判断是否可以将其分割成两个子集,使得两个子集的和相等。以下是代码的详细解释:

算法思路

  1. 预处理:首先计算数组nums的总和sum,并检查sum是否为偶数。如果是奇数,则直接返回false,因为无法均分为两个和相等的子集。如果为偶数,将目标和target设置为sum的一半。

  2. 初始化动态规划表:创建一个二维数组dp,其中dp[i][j]表示在前i个元素中是否存在子集的和等于j。数组的大小为nums.length乘以target + 1。注意,对于第一行的初始化有误,正确的初始化应该考虑nums[0]是否小于等于当前列索引j

  3. 填充动态规划表:遍历数组nums的每个元素,对于每个元素,从target开始反向遍历到nums[i](包括),更新dp[i][j]的值。有两种情况:

    • 如果当前背包容量j小于当前物品nums[i]的值,那么不选当前物品,状态继承自上一行,即dp[i][j] = dp[i - 1][j]
    • 否则,可以选择当前物品或者不选,取两者中能使得子集和等于j的最大可能性,即dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i])
  4. 返回结果:最后,检查dp[len - 1][target]是否等于target,如果等于则说明找到了一个子集和等于target,返回true;否则返回false

注意点

  • 代码中注释掉的部分是原始的错误初始化示例,正确的初始化逻辑已经在循环中通过条件判断实现了。
  • 另外,代码中还注释掉了打印dp数组的调试语句,这在开发过程中可用于观察动态规划表的构建过程,帮助理解算法的工作原理。

通过以上步骤,该算法有效地解决了给定数组是否可以分割成两个和相等的子集的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/747151.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git->git pull 和 git pull --rebase的详解

Git拉取代码的坑 格式&#xff1a;git xx指令 origin/远程仓库分支名称假如本地仓库和远程仓库都是空的 本地仓库向远程仓库提交一个文件 git commit -a -m "local first commit"&#xff1a;-a暂存修改文件到暂存区&#xff0c;准备本地提交。-m表示提交信息git pu…

2023: 芒种集•序言

2023: 芒种集•序言 2023: 芒种集•序言 从西南旅游回来&#xff0c;一直忙着整理游记“2024&#xff1a;追寻红色足迹”&#xff0c;之后又应初建平索要刘桂蓉遗作“我们一起走过”&#xff0c;于是把“别了&#xff0c;老屋”和诗作“二月”一并合编&#xff0c;把我写的悼念…

重大进展!微信支付收款码全场景接入银联网络

据中国银联6月19日消息&#xff0c;近日&#xff0c;银联网络迎来微信支付收款码场景的全面接入&#xff0c;推动条码支付互联互通取得新进展&#xff0c;为境内外广大消费者提供更多支付选择、更好支付体验。 2024年6月&#xff0c;伴随微信支付经营收款码的开放&#xff0c;微…

Chatopera 云服务实现类海尔服务智能客服的功能点比较 | Chatopera

在上一篇文章中&#xff0c;我分享了《智能客服体验分析&#xff0c;使用小程序海尔服务完成电器报修》。如果使用 Chatopera 云服务实现一个类似的应用&#xff0c;如何做呢&#xff1f;借助 Chatopera 云服务 可以实现一个智能客服&#xff0c;那么和现在的海尔服务小程序会有…

pd17虚拟机安装包:Parallels Desktop 17 激活版

Parallels Desktop 17 是一款功能强大的虚拟机软件&#xff0c;可以在 Mac 计算机上运行 Windows、Linux 和其他操作系统。使用 Parallels Desktop&#xff0c;您可以创建虚拟机并在其中安装各种操作系统&#xff0c;从而能够在同一台计算机上同时运行多个操作系统。 该软件具…

【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间

文章目录 前言一、datetime模块简介二、常用类和方法三、date类四、time类五、datetime类六、timedelta类七、常用的函数和属性八、代码及其演示 前言 Python的datetime模块提供了日期和时间的类&#xff0c;用于处理日期和时间的算术运算。这个模块包括date、time、datetime和…

给前端小白的11个建议(少走弯路)

作为一个编程4年的的前端工程师&#xff0c;一路走来踩过许多坑。希望我的经验能让你少踩些坑&#xff0c;在编程的路上走的更顺些&#xff01; 1. 禁用var声明 只使用const或let声明变量。并且首选const&#xff0c;当一个变量需要重新赋值时&#xff0c;才使用let。并且在创…

【C++】final关键字 | 避免派生、重写

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

wps linux node.js 加载项开发,和离线部署方案

环境准备 windwos 安装node.js 安装VSCode 安装wps linux 安装node.js 安装VSCode 安装wps 通过npm 安装wpsjs SDK 使用npm安装wpsjs npm install -g wpsjs 创建一个项目 wpsjs create WPS-Addin-PPT 创建项目会让你选择2个东西&#xff1a; 1&#xff1a;选择你的文…

Qt小项目 | 实现迅雷设置界面

文章目录 一、手写代码实现迅雷设置界面 一、手写代码实现迅雷设置界面 使用Qt控件&#xff08;如&#xff1a;QListWidget与QScrollArea等&#xff09;与布局实现腾讯会议登陆界面。设置界面除基本设置界面外&#xff0c;其他界面都是以图片的形式嵌入到项目中并没有手写代码。…

SonarQube集成Jenkins平台搭建

SonarQube平台搭建 一、项目搭建的必要条件 SonarQube 8.9.10 previous LTS 依据公司现有服务目前的Jdk版本1.8&#xff0c;需要选择一个适用的长期支持版本&#xff0c;我在这里选用的是SonarQube 8.9.10 previous LTS。下载地址&#xff1a;Download Previous SonarQube Ver…

制作高校专属PPT时,如何将校徽设置成透明底色?无须PS

目录 示例&#xff1a;以清华大学为例 1必应搜索“清华大学校徽” 2保存清华大学校徽及校名。 3将校徽导入到PPT中 ​4 选中校徽&#xff0c;然后依次选择“图片格式”-->颜色-->设置透明色​编辑 5出现“画笔”&#xff0c;由于截图的缘故&#xff0c;画笔没有在截…

华为仓颉编程语言

目录 一、引言 二、仓颉编程语言概述 三、技术特征 四、应用场景 五、社区支持 六、结论与展望 一、引言 随着信息技术的快速发展&#xff0c;编程语言作为软件开发的核心工具&#xff0c;其重要性日益凸显。近年来&#xff0c;华为公司投入大量研发资源&#xff0c;成功…

合合信息智能文档抽取:赋能不良资产管理行业的数字化转型

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 随着数字化浪潮的汹涌澎湃&#xff0c;全球各行各业正经历着前所未有的变革。人工智能技术的快速发展&#xff0c;以其独特的创新能力和应用潜力&#xff0c;正在深刻地改变着业务模式&#xff0c;推动产业效率的…

Java常用API基础语法(附带思维导图)

常见的API基本语法 String常用的操作方法 toCharArray equals() equalsIgonreCase substring(0,5) 从0-5的下标开始截取 substring&#xff08;5&#xff09; 从下标为5开始往后截取 replace …

springcould-config git源情况下报错app仓库找不到

在使用spring config server服务的时候发现在启动之后的一段时间内控制台会抛出异常&#xff0c;spring admin监控爆红&#xff0c;控制台信息如下 --2024-06-26 20:38:59.615 - WARN 2944 --- [oundedElastic-7] o.s.c.c.s.e.JGitEnvironmentRepository : Error occured …

第3章 小功能大用处-Bitmaps、HyperLogLog、GEO

1.Bitmaps 1.1数据结构模型 现代计算机用二进制&#xff08;位&#xff09;作为信息的基础单位&#xff0c;1个字节等于8位&#xff0c;例 如“big”字符串是由3个字节组成&#xff0c;但实际在计算机存储时将其用二进制表 示&#xff0c;“big”分别对应的ASCII码分别是98、10…

解决ArcGIS导出的svg格式的图片插入Word后的字体问题

背景 在ArcGIS中设置字体为Times New Roman&#xff0c;但导入Word后字体转为等线。 ArcGIS中的Layout 导入Word​​​​​​ 原因分析 Word无法识别嵌入进SVG格式文件中的字体。 解决方案 在Export Layer窗口中&#xff0c;将Embed fonts取消勾选&#xff0c;Convert cha…

【新闻】全球热钱,正在流入新加坡 这个夏天有点猛,油价看涨? 普华永道已丢了六成“A股大客户”

新加坡成为全球投资焦点&#xff0c;吸引大量并购活动。预计经济增长2.4%&#xff0c;股指上涨8%。未来可期待更多国际投资涌入。 近期&#xff0c;新加坡成为全球投资者的焦点&#xff0c;吸引了大量的并购和投资活动。 据报道&#xff0c;2024年第二季度&#xff0c;新加坡…

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址&#xff1a;https://github.com/nodeca/pako 文档地址&#xff1a;pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的&#xff0c;前端需要把这个数据解压缩之后才可以使用&#xff0c;这样可以大大降低网络数据传输的内容&…