跟着博主一起刷题:《剑指offer》(第五天)

news2024/12/23 10:26:01

跟着博主一起刷题
这里使用的是题库:
https://leetcode.cn/problem-list/xb9nqhhg/?page=1这里是引用

目录

    • 剑指 Offer 37. 序列化二叉树
    • 剑指 Offer 38. 字符串的排列
    • 剑指 Offer 40. 最小的k个数

剑指 Offer 37. 序列化二叉树

剑指 Offer 37. 序列化二叉树
在这里插入图片描述
序列化
观察发现,序列化就是对我们二叉树的一个层序遍历。这样就可以使用层序遍历的方法来序列化这颗二叉树。

// Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root==null)return "";
        StringBuilder sbr=new StringBuilder();
        List<TreeNode> queue=new ArrayList<>();//Queue和Deque不能存null
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode cur=queue.get(0);
            queue.remove(0);
            if(cur!=null){
                sbr.append(cur.val+",");
                queue.add(cur.left);
                queue.add(cur.right);
            }else{
                sbr.append("null,");
            }
        }
        //把末尾的null和多的”,“抹除
        int i=sbr.length()-1;
        for(;i>=0;i--){
            if(Character.isDigit(sbr.charAt(i))){
                break;
            }
        }
        return sbr.substring(0,i+1);
    }

那么反序列化就是根据我们的字符串一层一层的构建二叉树

// Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data.equals(""))return null;
        //根据,分割字符串
        String[] nodes=data.split(",");
        Deque<TreeNode> queue=new ArrayDeque<>();
        int i=0;//用于遍历nodes数组
        TreeNode root=new TreeNode(Integer.parseInt(nodes[i++]));
        queue.offer(root);
        while(i<nodes.length){
            TreeNode node=queue.poll();
            if(!nodes[i].equals("null")){
                node.left=new TreeNode(Integer.parseInt(nodes[i++]));
                queue.offer(node.left);
            }else{
                i++;
            }
            if(i>=nodes.length){
                break;
            }
            if(!nodes[i].equals("null")){
                node.right=new TreeNode(Integer.parseInt(nodes[i++]));
                queue.offer(node.right);
            }else{
                i++;
            }
        }
        return root;
    }

剑指 Offer 38. 字符串的排列

剑指 Offer 38. 字符串的排列
在这里插入图片描述
通过哈希表来记录该位置填过哪些字母

class Solution {
    List<String> list=new ArrayList<>();
    List<Character> line=new ArrayList<>();
    int n=0;
    public String[] permutation(String s) {
        //先转为字符数组
        char[] arr=s.toCharArray();
        rank(arr,0);
        String[] ss=new String[n];
        return list.toArray(ss);
    }

    private void rank(char[] arr,int start){
        if(start==arr.length){
            StringBuilder sbr=new StringBuilder();
            for(int i=0;i<line.size();i++){
                sbr.append(line.get(i));
            }
            n++;
            list.add(sbr.toString());
        }
        Set<Character> set=new HashSet<>();
        for(int i=start;i<arr.length;i++){
            if(set.contains(arr[i])&&i!=start){
                continue;
            }
            //记录该元素
            set.add(arr[i]);
            swap(arr,start,i);
            line.add(arr[start]);
            rank(arr,start+1);
            line.remove(start);
            swap(arr,start,i);
        }
    }

    private void swap(char[] arr,int i,int j){
        char c=arr[i];
        arr[i]=arr[j];
        arr[j]=c;
    }
}

剑指 Offer 40. 最小的k个数

剑指 Offer 40. 最小的k个数
40.这道题典型的利用堆的性质,要求k个我们就用k大小的堆,这里是求最小值,我们采用大根堆。
为了巩固代码,这里手写堆解题。

class Solution {
    int[] nums;
    int valid=0;//有效数据
    int size;//最大容量

    private void createHeap(int[] arr,int k){
        nums=new int[k];
        size=k;
        valid=0;
        for(int i=0;i<k;i++){
            addHeap(arr[i]);
        }
    }

    private void addHeap(int val){
        //先加进去,再调节
        if(valid>=size){
            //和堆顶元素比较,堆顶是最大的,如果比他小就加入进去
            if(val<nums[0]){
                nums[0]=val;//加入后进行向下调节
                setDown(0);
            }
        }else{
            nums[valid++]=val;//加入后进行向上调节
            setUp(valid-1);
        }
    }

    private void setDown(int parent){
        if(parent>=size-1)return;
        //先判断左右孩子那个大
        int child=2*parent+1;//左孩子 右孩子=child+1
        if(child+1<size&&nums[child]<nums[child+1]){
            child++;
        }
        if(child>=size)return;//没有孩子的情况
        if(nums[parent]<nums[child]){
            swap(parent,child);
            setDown(child);
        }
    }

    private void setUp(int child){
        //parent不是根节点,继续向上调整
        if(child==0)return;
        //获得父节点下标
        int parent=(child-1)/2;
        if(nums[child]>nums[parent]){
            swap(child,parent);
            setUp(parent);
        }
    }

    private void swap(int i,int j){
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }

    public int[] getLeastNumbers(int[] arr, int k) {
        if(arr.length==0||k==0)return new int[0];
        createHeap(arr,k);
        for(int i=k;i<arr.length;i++){
            addHeap(arr[i]);
        }
        return nums;
    }
}

共勉
请添加图片描述

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

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

相关文章

windows下mmclassification安装教程

文章目录mmclassification版本0.23.1一.官方安转教程二.安装教程mmclassification版本0.23.1 一.官方安转教程 官网 二.安装教程 创建conda环境 conda create --name openmmlab python3.8 -y进入创建的环境 conda activate openmmlab安转pytorcch conda install pytorch torc…

CSS知识点精学5-定位装饰

目录 一.定位 1&#xff0e;定位的基本介绍 2.定位的基本使用 3.静态定位 4.相对定位 5.绝对定位 6.子绝父相 a.优化学成网站推荐课程卡片 b.绝对定位盒子的居中&#xff08;案例&#xff09; 8.固定定位 9.元素的层级关系 二.装饰 1.垂直对齐方式 2.光标类型 3…

计算机网络实验报告

计算机网络实验报告 文章目录计算机网络实验报告一、验证性实验ipconfig实作一实作二问题ping实作一实作二问题tracert实作一问题一问题二问题三ARP实作一实作二实作三问题DHCP实作一问题netstat实作一实作二DNS实作一实作二实作三问题cache实作二二、Wireshark 实验数据链路层…

果蔬消毒机行业市场深度监测及发展趋势预测分析

2023-2029年中国果蔬消毒机行业市场深度监测及发展趋势预测报告报告编号&#xff1a;1691217本报告著作权归博研咨询所有&#xff0c;未经书面许可&#xff0c;任何组织和个人不得以任何形式复制、传播或输出中华人民共和国境外。任何未经授权使用本报告的相关商业行为都将违反…

STP生成树基础,一个难点

技术背景&#xff1a;二层交换机网络的冗余性与环路 二层环路带来的问题&#xff08;三层环路&#xff0c;ttl跳数达到一定次数会丢弃&#xff09; 典型问题 1&#xff1a;广播风暴不停的在接口内复制转发广播 2&#xff1a;MAC地址漂移 sw1接口1与2&#xff0c;对sw3的接收ma…

CentOS7.x下部署oracle19c环境

CentOS7.x下部署oracle19c环境 文章目录CentOS7.x下部署oracle19c环境前言一、环境准备工作1.1、虚拟机搭建及关闭防火墙和selinux1.2、RPM包预安装1.3、检查安装情况用户组已创建完成1.4、创建目录1.5、修改/etc/hosts 文件1.6、设置oracle口令1.7、设置环境变量1.8、将oracle…

[LeetCode周赛复盘] 第 327 场周赛20230108

[LeetCode周赛复盘] 第 327 场周赛20230108 一、本周周赛总结二、 [Easy] 6283. 正整数和负整数的最大计数1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6285. 执行 K 次操作后的最大分数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6284. 使字符串总不同字符的数目相等…

10、ThingsBoard-租户

1、租户的概念 目前,有很多的系统都是以多租户的形式来设计的,目的是为了实现数据隔离,thingsboard中也是如此。但是thingsboard把租户在抽象成了一种实体,后续还会讲解其它的实体;用官方的语言解释租户:您可以将租户视为一个单独的业务实体:它是拥有或生产设备和资产的…

Java中ThreadLocal说明

1、ThreadLocal是什么 ThreadLocal&#xff0c;即线程变量&#xff0c;是一个以ThreadLocal对象为键、任意对象为值的存储结构。 这个结构被附带在线程上&#xff0c;也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。 ——《Java并发编程艺术》如…

GrapeCity Documents Data Viewer[GcDataViewer] Crack

GrapeCity Documents Data Viewer&#xff0c;简称GcDataViewer&#xff0c;是一个统一的基于 JavaScript 的客户端查看器&#xff0c;旨在加载和预览与数据相关的所有流行文档格式。目前&#xff0c;查看器支持 XLSX、SSJSON 和 CSV 格式。除了仅加载数据文件外&#xff0c;数…

卷径计算(厚度累计法/膜厚积分法)

卷径计算的截面积法请参看下面的文章链接: 卷径计算详解(通过卷绕的膜长和膜厚进行计算)_RXXW_Dor的博客-CSDN博客有关卷绕+张力控制可以参看专栏的系列文章,文章链接如下:变频器简单张力控制(线缆收放卷应用)_RXXW_Dor的博客-CSDN博客_收放卷应用张力控制的开闭环算法,…

“/ArcGIS/services”应用程序中的服务器错误

本文迁移自本人网易博客&#xff0c;写于2013年1月5日No Content说明: 执行当前 Web 请求期间&#xff0c;出现未处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Web.HttpException: No Content源错误…

第三章 图形初阶

我曾经多次向客户展示以数字和文字表示的、精心整理的统计分析结果&#xff0c;得到的只是客户呆滞的眼神&#xff0c;尴尬得房间里只能听到鸟语虫鸣。然而&#xff0c;当我使用图形向相同的用户展示相同的信息时&#xff0c;他们往往会兴致盎然&#xff0c;甚至豁然开朗。我经…

jQuery控制元素的显示与隐藏(三种方式对比)

hide和show hide:是$(“.类名”)或$(“#标签名”)或$(“标签名”).hide() show:是$(“.类名”)或$(“#标签名”)或$(“标签名”).show() 元素直接消失&#xff0c;没有任何动态效果 slideToggle 通过控制元素的高度来显示与隐藏&#xff0c;因此会有动画效果。slideToggle如果…

RHCE ansible 作业

1、jinjia2模板 hosts.j2&#xff0c;内容如下(主机名和ip地址使用变量)&#xff1a; Welcome to 主机名 &#xff01;&#xff08;比如servera.lab.example.com&#xff09; My ip is ip地址. 要求在所有受管主机生成文件&#xff1a;/etc/welcome.txt。 2、角色部分 根据下列…

【Java】生产者消费者模型

【Java】生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题&#xff1a;生产者和消费者在同一时间段内共用同一个存储空间&#xff0c;生产者往存储空间中添加产品&#xff0c;消费者从存储空间中取走产品&#xff0c;当存储空间为空时&#xff0c;消费者…

设计模式的简单整理

单例的几种方式。 public class Single{private static volatile Single single;private single(){}public static Single getSingle(){if(single null){synchronized(Single.class){if(single null){single new Single();}}}return single;} } 在dcl中volatile为了防止指…

你问我答|为什么说数据中心散热迎来拐点?

喜报!      “绿色领跑企业”      近期,戴尔荣获由中环联合认证中心(CEC)颁发的“绿色领跑企业”奖项,这是继“环保产品领跑者”之后的又一殊荣,恭喜戴尔!    作为全球领先的数字化解决方案供应商,戴尔将可持续发展置于一切工作的核心,以智能、高效的解决方案帮助…

scikit-learn 线性回归 LinearRegression 参数详解

scikit-learn 线性回归 LinearRegression 参数详解LinearRegression 参数详解参考文献LinearRegression 参数详解 # 从 sklearn 中引入线性模型模块 from sklearn import linear_model # 建立线性回归对象 reg reg linear_model.LinearRegression(fit_interceptTrue,copy_XTr…

Stack 155.最小栈

力扣155. 最小栈 【解法一】俩个栈实现 【解法二】一个栈实现 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推…