左神算法之中级提升班(9)

news2024/12/28 4:06:38

【案例1】

【题目描述】

 【思路解析】

因为它数字的范围只能为1 - n,然后数组范围0 - n-1,所以说如果没有缺失值的话,每个i位置应该放i + 1,所以我们直接对每个数组完成这个操作,让每个i位置尽可能放i+1,如果有些位置不是i+1,则这些位置就是缺失值,遍历打印即可 。

【代码实现】

/**
 * @ProjectName: study3
 * @FileName: Ex1
 * @author:HWJ
 * @Data: 2023/7/31 9:48
 */
public class Ex1 {
    public static void main(String[] args) {
        int[] arr = {1, 3, 4, 3};
        printNumberNoInArray(arr);
    }

    public static void printNumberNoInArray(int[] arr){
        if (arr == null || arr.length == 0){
            return;
        }
        for (int i : arr) {
            modify(i, arr);
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != i + 1){
                System.out.println(i + 1);
            }
        }

    }

    // 这里实现让每个i位置上尽可能方i+1
    public static void modify(int value, int[] arr){
        while(arr[value - 1] != value){
            int tmp = arr[value - 1];
            arr[value - 1] = value;
            value = tmp;
        }
    }

}

【案例2】

【题目描述】

【思路解析  平凡解技巧  从业务中分析终止条件 重点

这道题容易想到使用暴力递归来解决,但限制条件只有一个cur == end,不足以作为basecase,需要补充限制条件,因为end和start均为偶数,且end > > start ,所以有一个只用点赞到达end的平凡解,如果高于这个花费的解,直接不考虑。

从业务中分析,因为他有一个私聊是可以-2,然后在递归中,它有一个分支可能一直在-2,导致无法到达end,所以限制条件增加一个为start已经小于0停止。

从业务中分析,他有一个*2的方式,但是总有一次*2可以使他第一次比b大,此时如果再次*2就会花费更多的私聊钱,再分析再次*2会大于2*b,所以增加一个限制条件start不能大于 2 * b;

【代码实现】

/**
 * @ProjectName: study3
 * @FileName: Ex2
 * @author:HWJ
 * @Data: 2023/7/31 10:39
 */
public class Ex2 {
    public static void main(String[] args) {
        System.out.println(getMinMoney(3, 100, 1, 2, 6));
    }

    public static int getMinMoney(int x, int y, int z, int start, int end) {
        int limitCoin = ((end - start) / 2) * x;
        int limitAim = end * 2;
        return process(x, y, z, start, end, 0, limitCoin, limitAim);
    }

    // preMoney代表当前已经花了多少钱
    // limitCoin代表平凡解所需要花费的钱币
    // limitAim 代表当前start的上界
    public static int process(int x, int y, int z, int start, int end, int preMoney, int limitCoin, int limitAim) {
        if (start == end) {
            return preMoney;
        }
        if (start < 0) {
            return Integer.MAX_VALUE;
        }
        if (preMoney > limitCoin) {
            return Integer.MAX_VALUE;
        }
        if (start > limitAim) {
            return Integer.MAX_VALUE;
        }
        int p1 = process(x, y, z, start + 2, end, preMoney + x, limitCoin, limitAim);
        int p2 = process(x, y, z, start * 2, end, preMoney + y, limitCoin, limitAim);
        int p3 = process(x, y, z, start - 2, end, preMoney + z, limitCoin, limitAim);
        return Math.min(p1, Math.min(p2, p3));
    }

}

【案例3】

【题目描述】

【思路解析】

可以通过后面关联矩阵生成一个图,然后从末尾H开始做一个图的宽度优先遍历,每个节点实现一个哈希表,然后哈希表里面维护当花费天数增加时,收益一定增加,然后每个节点就得到了它独自的哈希表,然后最后将所有哈希表汇总,这样就得到了所有完成方式。然后最后根据限制天数来查表即可。最后这里也可以用大根堆来做,只有小于限制天数的值才加入,然后里面根据收益大小来维护大根堆。两个方式都差不多。

【案例4】

【题目描述】

 【思路解析】

因为& | ^ 这几个运算都是二元运算,则表达式长度应该为奇数且大于1,满足奇数位上只有0或1,偶数位上只有&、|或^运算符,如果不满足此规则的字符串直接返回0.

然后对于组合就有如下定义,对于每一个确定的表达式组合应有确定的括号,对于不同的括号填充,则认为不同的组合方式。括号可以认为是进行运算时的顺序规定,不一定真的要在字符串上填充括号。

【代码实现】

import java.util.Scanner;

/**
 * @ProjectName: study3
 * @FileName: Ex4
 * @author:HWJ
 * @Data: 2023/9/11 14:21
 */
public class Ex4 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String str = input.next();
        boolean desire = input.nextBoolean();
        if (!check(str)){
            System.out.println(0);
        }else {
            char[] charArray = str.toCharArray();
            int ans = count(charArray, 0, charArray.length  - 1, desire);
            System.out.println(ans);
        }
    }

    public static boolean check(String str){
        // 因为 | & ^ 运算都是二元运算,所以有效字符串长度应该为奇数,并且奇数位是 1 或者 0, 偶数位是 二元运算符
        if (str.length() % 2 == 0 || str.length() == 1){
            return false;
        }
        char[] charArray = str.toCharArray();
        for (int i = 0; i < charArray.length; i+=2) {
            if (charArray[i] != '0' && charArray[i] != '1'){
                return false;
            }
        }
        for (int i = 1; i < charArray.length; i+=2) {
            if (charArray[i] != '|' && charArray[i] != '&' && charArray[i] != '^'){
                return false;
            }
        }
        return true;
    }

    public static int count(char[] chars, int L, int R, boolean desire) {
        if (L == R) {
            if (chars[L] == '0') {
                return desire ? 0 : 1;
            } else {
                return desire ? 1 : 0;
            }
        }
        int res = 0;
        for (int i = L + 1; i < R; i += 2) {
            if (desire) {
                switch (chars[i]) {
                    case '&':
                        res += count(chars, L, i - 1, true) * count(chars, i + 1, R, true);
                        break;
                    case '|':
                        res += count(chars, L, i - 1, true) * count(chars, i + 1, R, true);
                        res += count(chars, L, i - 1, true) * count(chars, i + 1, R, false);
                        res += count(chars, L, i - 1, false) * count(chars, i + 1, R, true);
                        break;
                    case '^':
                        res += count(chars, L, i - 1, true) * count(chars, i + 1, R, false);
                        res += count(chars, L, i - 1, false) * count(chars, i + 1, R, true);
                        break;
                }
            } else {
                switch (chars[i]) {
                    case '|':
                        res += count(chars, L, i - 1, false) * count(chars, i + 1, R, false);
                        break;
                    case '&':
                        res += count(chars, L, i - 1, false) * count(chars, i + 1, R, false);
                        res += count(chars, L, i - 1, true) * count(chars, i + 1, R, false);
                        res += count(chars, L, i - 1, false) * count(chars, i + 1, R, true);
                        break;
                    case '^':
                        res += count(chars, L, i - 1, true) * count(chars, i + 1, R, true);
                        res += count(chars, L, i - 1, false) * count(chars, i + 1, R, false);
                        break;
                }
            }
        }
        return res;
    }
}

【动态规划代码】

import java.util.Scanner;

/**
 * @ProjectName: study3
 * @FileName: Ex4_2
 * @author:HWJ
 * @Data: 2023/9/11 15:10
 */
public class Ex4_2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String str = input.next();
        boolean desire = input.nextBoolean();
        int ans = dp(str, desire);
        System.out.println(ans);
    }

    public static boolean check(String str) {
        // 因为 | & ^ 运算都是二元运算,所以有效字符串长度应该为奇数,并且奇数位是 1 或者 0, 偶数位是 二元运算符
        if (str.length() % 2 == 0 || str.length() == 1) {
            return false;
        }
        char[] charArray = str.toCharArray();
        for (int i = 0; i < charArray.length; i += 2) {
            if (charArray[i] != '0' && charArray[i] != '1') {
                return false;
            }
        }
        for (int i = 1; i < charArray.length; i += 2) {
            if (charArray[i] != '|' && charArray[i] != '&' && charArray[i] != '^') {
                return false;
            }
        }
        return true;
    }

    public static int dp(String str, boolean desire) {
        if (!check(str)) {
            return 0;
        }
        int N = str.length();
        char[] charArray = str.toCharArray();
        int[][] tMap = new int[N][N];
        int[][] fMap = new int[N][N];
        for (int i = 0; i < N; i += 2) {
            tMap[i][i] = charArray[i] == '1' ? 1 : 0;
            fMap[i][i] = charArray[i] == '1' ? 0 : 1;
        }
        for (int row = N - 3; row >= 0; row -= 2) {
            for (int col = row + 2; col < N; col += 2) {
                for (int i = row + 1; i < N; i += 2) {
                    switch (charArray[i]) {
                        case '&':
                            tMap[row][col] += tMap[row][i - 1] * tMap[i + 1][col];
                            break;
                        case '|':
                            tMap[row][col] += tMap[row][i - 1] * tMap[i + 1][col];
                            tMap[row][col] += tMap[row][i - 1] * fMap[i + 1][col];
                            tMap[row][col] += fMap[row][i - 1] * tMap[i + 1][col];
                            break;
                        case '^':
                            tMap[row][col] += tMap[row][i - 1] * fMap[i + 1][col];
                            tMap[row][col] += fMap[row][i - 1] * tMap[i + 1][col];
                            break;
                    }
                    switch (charArray[i]) {
                        case '&':
                            fMap[row][col] += fMap[row][i - 1] * tMap[i + 1][col];
                            fMap[row][col] += fMap[row][i - 1] * fMap[i + 1][col];
                            fMap[row][col] += tMap[row][i - 1] * fMap[i + 1][col];
                            break;
                        case '|':
                            fMap[row][col] += fMap[row][i - 1] * fMap[i + 1][col];
                            break;
                        case '^':
                            fMap[row][col] += tMap[row][i - 1] * tMap[i + 1][col];
                            fMap[row][col] += fMap[row][i - 1] * fMap[i + 1][col];
                            break;
                    }
                }
            }
        }
        if (desire) {
            return tMap[0][N - 1];
        } else {
            return fMap[0][N - 1];
        }

    }
}

【案例5】

【题目描述】【很重要】【编辑距离问题】

【思路解析】

这里可以使用dp动态规划,来进行寻找最小代价。

这里的i和j表示str1使用i个字符,完成str2的j个字符
分为以下情况
(1)str1使用i-1个字符完成str2的j-1个字符,再将str1第i个字符替换为str2第j个字符,如果相等就可以剩去替换的过程
(2)str1使用i-1个字符完成str2的j个字符,再将str1第i个字符删去
  (3) str1使用i个字符完成str2的j-1个字符,再添加str2的第j个字符
则str1使用i个字符,完成str2的j个字符的最小使用,则为上面的最小值

 【代码实现】

import java.util.Scanner;

/**
 * @ProjectName: study3
 * @FileName: Ex5
 * @author:HWJ
 * @Data: 2023/9/11 15:01
 */
public class Ex5 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String str1 = input.next();
        String str2 = input.next();
        int add = input.nextInt();
        int del = input.nextInt();
        int replace = input.nextInt();
        int ans = dp(str1, str2, add, del, replace);
        System.out.println(ans);
    }

    public static int dp(String str1, String str2, int add, int del, int replace){
        int N1 = str1.length();
        int N2 = str2.length();
        int[][] map = new int[N1 + 1][N2 + 1];
        for (int i = 1; i <= N2; i++) {
           map[0][i] = i * add;
        }
        for (int i = 1; i <= N1; i++) {
            map[i][0] = i * del;
        }
        for (int i = 1; i <= N1; i++) {
            for (int j = 1; j <= N2; j++) {
                // 这里的i和j表示str1使用i个字符,完成str2的j个字符
                // 分为以下情况
                // (1)str1使用i-1个字符完成str2的j-1个字符,再将str1第i个字符替换为str2第j个字符,如果相等就可以剩去替换的过程
                // (2)str1使用i-1个字符完成str2的j个字符,再将str1第i个字符删去
                //  (3) str1使用i个字符完成str2的j-1个字符,再添加str2的第j个字符
                // 则str1使用i个字符,完成str2的j个字符的最小使用,则为上面的最小值
                map[i][j] = map[i - 1][j] + del;
                map[i][j] = Math.min(map[i][j], map[i][j - 1] + add);
                map[i][j] = Math.min(map[i][j], map[i][j - 1] + str1.charAt(i - 1) == str2.charAt(j - 1) ? 0 : replace);
            }
        }
        return map[N1][N2];
    }

}

【案例6】

【题目描述】

【思路解析】

建立一个每个字符的词频表,然后从当前位置开始遍历每一个字符,经历一个字符就词频减1,当出现某个字符词频为0时,就在所有经历过的字符中,选择一个字典序最小的字符,然后删去除了他其他相同的字符,并删去在他之前的字符。直到所有字符的词频都为1.

【代码实现】

import java.util.Scanner;

/**
 * @ProjectName: study3
 * @FileName: Ex6
 * @author:HWJ
 * @Data: 2023/9/11 16:14
 */
public class Ex6 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String str = input.next();
        String s = delete(str);
        System.out.println(s);
    }
    public static String delete(String str){
        if (str.length() <= 1){
            return str;
        }
        // 这里假设字符的ascii码值最大为256;
        int[] map = new int[256];
        int max = 1;
        for (int i = 0; i < str.length(); i++) {
            map[str.charAt(i)] += 1;
            max = Math.max(max, map[str.charAt(i)]); 
        }
        if(max == 1){
            return str;
        }else {
            for (int i = 0; i < str.length(); i++) {
                map[str.charAt(i)] -= 1;
                if (map[str.charAt(i)] == 0){
                    int min = Integer.MAX_VALUE;
                    int index = -1;
                    for (int j = 0; j <= i; j++) {
                        min = Math.min(min, str.charAt(j));
                        index = min == str.charAt(j) ? j : index;
                    }
                    return String.valueOf(str.charAt(index)) +
                            delete(str.substring(index + 1).replace(String.valueOf(str.charAt(index)), ""));
                }
            }
        }
        return "";
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++(三)——运算符重载

运算符重载 重定义或重载大部分 C 内置的运算符就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数&#xff0c;函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样&#xff0c;重载运算符有一个返回类型和一个参数列表。不能为了重载而重…

GeoServer 安装及使用教程

GeoServer 安装及使用教程 一、前言二、安装1. 下载和安装Java2. 下载、安装、部署GeoServer3. 启动GeoServer4. 发布数据5. 结论 一、前言 GeoServer是一个开源的地理空间数据服务器&#xff0c;可以将地图数据发布为Web服务。在本篇教程中&#xff0c;我们将介绍如何安装GeoS…

B站:AB test [下]

Focus在&#xff1a;AB Test结束后&#xff0c;如何进行显著性检验&#xff1f;&#xff08;以判断改动是否有效果&#xff09; 引入&#xff1a;Z检验和T检验 而T检验适用于 n<30 的小样本 值得注意的是&#xff1a;统计上显著并不意味着现实中显著&#xff01; e.g. 加速…

Vue面试题以及解答(持续扩展中.....)

##Vue面试题## 1.组件中通讯方式有哪些 组件中通讯有$emit&#xff0c;props&#xff0c;vuex&#xff0c;provid和inject&#xff0c;$parent/$children&#xff0c;$refs&#xff0c;全局总线时间EvenBus&#xff0c;订阅与发布模式的subscrip/publish 2.Vue2和Vue3的区别…

尚硅谷大数据项目《在线教育之实时数仓》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 P001 P002 P003 P004 P005 P001 以在线教育采集系统和离线数仓为前置基础&#xff0c;分为三个部分讲解&#xff1a;实时数仓架构介绍、数仓模型搭建、Suger可视化大屏展示。 P002 P0…

机票预定系统的软件工程分析报告

目 录 1 项目开发计划书……………………………………………………&#xff08;页码&#xff09; 2 软件需求规格说明书………………………………………………&#xff08;页码&#xff09; 3设计规格说明书……………………………………………………&#xff08;页码&…

uni-number-box的坑-无法实现数据双向绑定

业务场景&#xff1a;多规格商品----每一个规格定一个起购量&#xff0c;切换不同规格时动态改变起购数量。 代码&#xff1a; <uni-number-box class"step" ref"ChildComponents" :cid"productSku.productSkuUuid" :min"productSku.s…

STC8单片机PWM定时器+EC11编码器实现计数

STC8单片机PWM定时器+EC11编码器实现计数 📌相关篇《STC单片机+EC11编码器实现调节PWM输出占空比》📍《stc单片机外部中断+EC11编码器实现计数功能》🔖STC8系列支持此功能的型号: ✨从上面的相关篇中有通过通用定时器加外部中断以及常规方法实现驱动EC11编码器的方法。本…

Linux C++ 海康摄像头 Alarm Demo

项目结构 CMakeLists.txt cmake_minimum_required(VERSION 3.7)SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")project(CapPicture…

大规模流量下的云边端一体化流量调度体系

/ 火山引擎是字节跳动旗下的云服务平台&#xff0c; 将字节跳动快速发展过程中积累的增长方法、技术能力和工具开放给外部企业&#xff0c;提供云基础、视频与内容分发、数智平台VeDI、 人工智能、开发与运维等服务&#xff0c;帮助企业在数字化升级中实现持续增长。LiveVid…

在 IntelliJ IDEA 中远程部署 Java 程序

文章目录 远程调试与远程部署的区别远程部署的步骤完整源代码 笔者的运行环境&#xff1a; 客户端&#xff1a; 部署成功过的客户端的 Java 版本&#xff1a; Java 17.0.7 部署成功过的客户端的 Java 程序&#xff1a; Spring Boot 3.1.0 部署成功过的客户端的 IntelliJ IDEA…

论文浅尝 | 思维树:使用大语言模型反复思考解决问题

笔记整理&#xff1a;许泽众&#xff0c;浙江大学博士&#xff0c;研究方向为知识图谱上的神经符号推理 链接&#xff1a;https://arxiv.org/abs/2305.10601 1. 动机 语言模型是一种强大的工具&#xff0c;可以用于各种需要数学、符号、常识或知识推理的任务。然而&#xff0c;…

初识MyBatis(一)基于配置文件下的一些增删改查

MyBatis可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的POJO&#xff08;Plain Old Java Objects&#xff0c;普通的Java对象&#xff09;映射成数据库中的记录 MyBatis 是一个 半自动的ORM&#xff08;Object Relation Mapping&#xff09;框架 创建好m…

手机+卫星的科技狂想

最近硬件圈最火热的话题之一&#xff0c;应该就是突然上线、遥遥领先的华为Mate 60 Pro了。 其中&#xff0c;CPU和类5G网速是怎么实现的&#xff0c;是大家特别关注的问题。相比之下&#xff0c;卫星通话这个功能&#xff0c;讨论度就略低一些&#xff08;没有说不火的意思&am…

62、SpringBoot 使用RestTemplate 整合第三方 RESTful 服务

这节的要点&#xff1a; 就是弄两个项目 &#xff0c; 从 端口9090 这个项目&#xff0c;通过 restTemplate&#xff0c; 去访问 端口8080 的项目&#xff0c;并获取8080项目的数据。 ★ RESTful服务包含两方面的含义 1. 自己的应用要暴露一些功能供别人来调用。此时我们是服…

postgresql-DML

DML 语句 创建示例表插入数据插入单行数据插入多行数据复制数据返回插入的数据 更新数据单表更新跨表更新返回更新后的数据 删除数据单表删除跨表删除返回被删除的数据 合并数据MERGE 语句INSERT ON CONFLICT DML 语句与 CTE 创建示例表 CREATE TABLE dept (department_id int…

面向Ai设计的Mojo编程语言支持下载,当前只有Linux系统版本

据了解&#xff0c;Mojo是Modular AI公司开发的专门面向AI设计的编程语言&#xff0c;号称比Python快68000倍。 Mojo现已开放本地下载运行&#xff0c;除了编译器之外&#xff0c;Mojo SDK还包括一整套开发者和IDE工具&#xff0c;并用来构建和迭代 Mojo应用。 公司方面表示&…

leetcode 589. N 叉树的前序遍历(java)

N 叉树的前序遍历 题目描述前序遍历后序遍历 题目描述 难度 - 简单 LC - 589.N叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例…

RK3399平台开发系列讲解(内核调试篇)USB摄像头快速测试

🚀返回专栏总目录 文章目录 一、检测设备二、安装必要的库三、 mjpeg-stream 安装四、实时预览沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇介绍如何快速测试 USB 摄像头。 一、检测设备 将 USB 摄像头插上,查看是否找到设备,输入指令:v4l2-ctl --list-d…

vuex中actions异步调用以及读取值

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 将根据segmentId查出来的合同信息托管到vuex中&#xff0c;让每个人都可以获取到合同信息 描述以及问题点 1&#xff1a;调用vuex异步函数的语法是 this.$store.dispatch(actions方法名,值) 2&#…