LeetCode 7, 703, 287

news2024/9/30 15:27:09

文章目录

  • 7. 整数反转
    • 题目链接
    • 标签
    • 思路
      • 反转操作
      • 反转的数的范围
    • 代码
  • 703. 数据流中的第 K 大元素
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 287. 寻找重复数
    • 题目链接
    • 标签
    • 思路
    • 代码


7. 整数反转

题目链接

7. 整数反转

标签

数学

思路

反转操作

反转实际上很简单,假设要反转数字 n u m num num,反转的结果存储在 r e v rev rev 中,反转的流程如下:

  • 先获取 n u m num num 的最后一位。
  • 然后给 r e v rev rev 10 10 10,再给 r e v rev rev 加上 n u m num num 的最后一位。
  • 最后给 n u m num num 除以 10 10 10
  • 重复以上流程,直到 n u m num num 0 0 0

反转的数的范围

如果使用 long 类型来进行反转,那么就不需要对 r e v rev rev 限制范围了,直接在最后判断 r e v rev rev 是否超过 int 的范围 [Integer.MIN_VALUE, Integer.MAX_VALUE] 即可, 如果超过了,则返回 0 0 0

然而,本题不允许使用 long,所以就不能在 r e v rev rev 溢出之后再进行判断,而是 r e v rev rev 溢出之前进行判断

Integer.MIN_VALUE M I N V MINV MINVInteger.MAX_VALUE M A X V MAXV MAXV

如果 r e v rev rev 溢出,则它的取值范围是 r e v < M I N V rev \lt MINV rev<MINV r e v > M A X V rev \gt MAXV rev>MAXV

在溢出前,也就是还没有进行第二步反转操作之前, r e v rev rev 比之后小 10 10 10 倍,如果想要在溢出之前就进行判断,则 r e v rev rev 溢出前的取值范围应该是 r e v × 10 < M I N V rev \times 10 \lt MINV rev×10<MINV r e v × 10 > M A X V rev \times 10 \gt MAXV rev×10>MAXV

由于 r e v rev rev 再乘 10 10 10 就溢出了,所以应该给 M I N V , M A X V MINV, MAXV MINV,MAXV 除以 10 10 10,此时 r e v rev rev 的溢出范围是 r e v < M I N V 10 rev \lt \frac{MINV}{10} rev<10MINV r e v > M A X V 10 rev \gt \frac{MAXV}{10} rev>10MAXV

分别用 M I N , M A X MIN, MAX MIN,MAX 来记录 M I N V 10 , M A X V 10 \frac{MINV}{10}, \frac{MAXV}{10} 10MINV,10MAXV,则 r e v rev rev 的溢出范围是 r e v < M I N rev \lt MIN rev<MIN r e v > M A X rev \gt MAX rev>MAX

代码

class Solution {
    public int reverse(int num) {
        final int MAX = Integer.MAX_VALUE / 10;
        final int MIN = Integer.MIN_VALUE / 10;

        int rev = 0;
        while (num != 0) {
            if (rev < MIN || rev > MAX) { // 先判断 rev 是否有可能溢出
                return 0; // 如果可能溢出,则返回 0
            }

			// 反转操作
            int digit = num % 10;
            rev = rev * 10 + digit;
            num /= 10;
        }
        return rev;
    }
}

703. 数据流中的第 K 大元素

题目链接

703. 数据流中的第 K 大元素

标签

树 设计 二叉搜索树 二叉树 数据流 堆(优先队列)

思路

本题的要求实现的数据结构能够找到第 k k k 大的元素,这个需求和 LeetCode 215. 数组中的第K个最大元素 的需求相似,所以考虑使用 小顶堆 来作为底层的数据结构。对于新增的数,仍旧分类讨论:

  • 如果堆未满,则直接将数字添加到堆中。
  • 如果堆已满,则考虑 新增的数 是否比 堆顶的数 大,如果大,则用新数替换堆顶的数;否则抛弃新增的数。

代码

class KthLargest {
    public KthLargest(int k, int[] nums) {
        heap = new MinHeap(k); // 构造大小为 k 的堆
        for (int num : nums) { // 将 nums 中的所有数 新增 到堆中
            add(num);
        }
    }
    
    public int add(int val) {
        if (!heap.isFull()) { // 如果堆未满
            heap.offer(val); // 则直接添加
        } else if (val > heap.peek()) { // 如果 新增的数 > 堆顶的数
            heap.replace(val); // 则进行替换
        }
        return heap.peek(); // 返回堆顶的数
    }

    private MinHeap heap;
    private static class MinHeap { // 小顶堆
        public MinHeap(int capacity) {
            data = new int[capacity];
        }
        // 添加新数
        public void offer(int value) {
            int child = up(value);
            data[child] = value;
            size++;
        }
        // 将原先堆顶的数字替换成 newValue
        public void replace(int newValue) {
            data[0] = newValue; // 先替换
            down(0); // 后将其下潜到合适的位置
        }
        // 取出最小的数
        public int peek() {
            return data[0];
        }
        // 检查堆是否已满
        public boolean isFull() {
            return (size == data.length);
        }
        // 上浮操作
        private int up(int value) {
            int child = size;
            int parent = getParent(child);
            // 类似 插入排序
            while (child > 0
            		&& value < data[parent]) { // 只有 当前数 小于 父节点的数 才进行“交换”
                data[child] = data[parent];
                child = parent;
                parent = getParent(parent);
            }
            return child;
        }
        // 下潜操作
        private void down(int parent) {
            int left = getLeft(parent);
            int right = left + 1;
            int min = parent; // min 是 在父节点和两个子节点中,最小值的 索引
            if (left < size && data[min] > data[left]) {
                min = left;
            }
            if (right < size && data[min] > data[right]) {
                min = right;
            }

            if (min == parent) {
                return;
            }

            swap(min, parent);
            down(min);
        }
        // 根据 子节点的索引 获取 父节点的索引
        private int getParent(int child) {
            return (child - 1) >> 1;
        }
        // 根据 父节点的索引 获取 左子节点的索引
        private int getLeft(int parent) {
            return (parent << 1) + 1;
        }
        // 交换指定索引的两个元素
        private void swap(int i, int j) {
            int temp = data[j];
            data[j] = data[i];
            data[i] = temp;
        }
        private int[] data;
        private int size;
    }
}

287. 寻找重复数

题目链接

287. 寻找重复数

标签

位运算 数组 双指针 二分查找

思路

题目中给定了一个包含 n + 1 n + 1 n+1 个整数的数组 n u m s nums nums ,其数字都在 [ 1 , n ] [1, n] [1,n] 范围内(包括 1 1 1 n n n),也就是说 n u m s [ i ] nums[i] nums[i] 的值 可以作为索引,所以可以考虑使用 算法——Floyd判圈算法 的思想解决。

先举个例子表明本题的 n u m s nums nums 可以形成 循环链表 的形式:
alt text
上图中的 n u m s = [ 1 , 2 , 3 , 2 ] nums = [1, 2, 3, 2] nums=[1,2,3,2],如果用 n u m s [ i ] nums[i] nums[i] 作为 n u m s nums nums 中下一个元素的索引,那么就可以将数组转化为“链表”,只看“链表”的属性则可以得到下面的图,这正好可以使用 Floyd 判圈算法 解决,步骤如下:

  1. 使用快慢指针从头开始遍历“链表”,快指针每次走两步,慢指针每次走一步,直到快慢指针相遇,即快慢指针的值相等。
  2. 让慢指针从头开始遍历,快指针从相遇点开始遍历,两个指针分别每次只走一步,直到相遇,相遇后返回结果即可。

在链表中,用 slow = slow.next; fast = fast.next.next; 表示移动;在本题中,用 slow = nums[slow]; fast = nums[nums[fast]] 表示移动。

代码

class Solution {
    public int findDuplicate(int[] nums) {
        int slow = 0, fast = 0;
        do {
            slow = nums[slow];
            fast = nums[nums[fast]];
        } while (slow != fast);

        slow = 0; // 慢指针回到原点
        while (slow != fast) {
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;
    }
}

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

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

相关文章

数据结构之Map与Set(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 二叉搜索树 Map和Set的介绍与使用 Map的常用方法及其示例 Set的常用方法及其示例 哈希表…

客户管理系统平台(CRM系统)是什么?它的核心主要解决哪些问题?

客户管理系统平台CRM是什么&#xff1f;客户关系管理系统CRM的核心主要解决哪些问题&#xff1f; CRM系统不仅仅是一套软件&#xff0c;更是一种策略&#xff0c;一种管理理念和一种企业发展方向。它通过整合客户数据、优化业务流程、提升客户体验&#xff0c;帮助企业在激烈的…

K8s第三节:k8s1.23.1升级为k8s1.30.0

上回书说到我们使用了kubeadm安装了k8s1.23.1,但是在k8s1.24之前还是使用docker作为容器运行时&#xff0c;所以这一节我打算将我安装的k8s集群升级为1.30.0版本&#xff1b; 1、修改containerd 配置 因为我们安装的docker自带containerd&#xff0c;所以我们不需要重新安装con…

蓝凌EKP二次开发资料大全 完整蓝凌二次开发资料 蓝凌 EKP开发实战教程 蓝凌OA二次开发资料大全 蓝凌OA java开发快速入门

蓝凌EKP二次开发资料大全 完整蓝凌二次开发资料 蓝凌 EKP开发实战教程 蓝凌OA二次开发资料大全 记得两年前花了非常贵的费用去现场学习的资料&#xff0c;把这些开发技术文档分享出来&#xff0c;希望通过这个资料&#xff0c; 为大家学习开发大大减少时间。期待大家能快速上…

《UE5_C++多人TPS完整教程》学习笔记32 ——《P33 动画蓝图(Animation Blueprint)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P33 动画蓝图&#xff08;Animation Blueprint&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者…

Python实战:类

一、圆的面积、周长 class Circle:# 初始化一个类参数&#xff1a;rdef __init__(self,r):self.r r# 计算面积的方法def get_area(self):return 3.14*pow(self.r,2)# 计算周长的方法def get_perimeter(self):return 2*3.14*self.r#创建对象 r eval(input(请输入圆的半径&…

Vue 2 和 Vue 3 生命周期钩子

Vue 2 和 Vue 3 生命周期钩子 在 Vue.js 开发中&#xff0c;了解生命周期钩子对于编写有效的组件至关重要。Vue 2 和 Vue 3 在生命周期钩子上大致相同&#xff0c;但 Vue 3 的 Composition API 引入了一种新的方式来处理它们。这里我会概述两者的生命周期钩子&#xff0c;并指…

2024年8月7日(mysql主从 )

回顾 主服务器 [rootmaster_mysql ~]# yum -y install rsync [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz [rootmaster_mysql ~]# cp -r mysql-8.0.33-linux-glibc2.…

QT找不到编辑框

问题展示&#xff1a; 解决办法&#xff1a;ALT0 然后我的变成了这种&#xff1a; 解决办法&#xff1a;文件系统改变成项目&#xff1a;

DNTR——F

文章目录 AbstractIntroductionContribution Related WorkAdvancements in Feature Pyramid Networks (FPNs)Coarse-to-Fine Image Partitioning in Drone Imagery DetectionDevelopments in Loss Function Approaches for Tiny Object DetectionR-CNN for Small Object Detect…

大炼模型进入尾声,“失眠”的欧洲和日本能否扳回一局?

大数据产业创新服务媒体 ——聚焦数据 改变商业 2022年末&#xff0c;ChatGPT-3.5的惊艳亮相&#xff0c;瞬间引爆了全球范围内的生成式AI&#xff08;GenAI&#xff09;热潮。 这场现代版的"淘金热"迅速在科技领域蔓延&#xff0c;尤其是在全球两大科技强国——中国…

简单分享下python打包手机app的apk

Python 把python程序打包成apk的完整步骤 1. 引言 在移动应用市场蓬勃发展的今天&#xff0c;开发人员常常需要将自己的Python程序打包成APK文件&#xff0c;以便在Android设备上运行。本文将详细介绍将Python程序打包成APK的完整步骤。 2. 准备工作 在开始打包前&#xff0c…

全网最详解LVS(Linux virual server)

目录 一、LVS&#xff08;Linux virual server&#xff09;是什么&#xff1f; 二、集群和分布式简介 2.1、集群Cluster 2.2、分布式 2.3、集群和分布式 三、LVS运行原理 3.1、LVS基本概念 3.2、LVS集群的类型 3.2.1 nat模式 3.2.2 DR模式 3.2.3、LVS工作模式总结 …

RSYSLOG收到华为防火墙日志差8小时的解决方法

RSYSLOG收到华为防火墙日志差8小时 这个问题其实不关Rsyslog配置的事&#xff0c;只要修改华为墙的配置就好 处理方法&#xff1a; info-center loghost 172.18.6.91 language Chinese local-time 在华为web界面添加ip是不会添加local-time这个参数的&#xff0c; 需要在命令…

sqli-labs第二关详解

首先让id1&#xff0c;正常显示&#xff0c;接着尝试and 11和and 12 and 11正常&#xff0c;and 12不正常 所以可以判断是数字型注入&#xff0c;使用order by 判断列数&#xff0c;发现有三个字段 使用union语句&#xff0c;找出能显示信息的地方 接下来就是找出数据库名称和版…

Leetcode75-7 除自身以外数组的乘积

没做出来 本来的思路是遍历一遍得到所有乘积和然后除就行 但是题目不能用除法 答案的思路 for(int i0;i<n;i) //最终每个元素其左右乘积进行相乘得出结果{res[i]*left; //乘以其左边的乘积left*nums[i];res[n-1-i]*right; //乘以其右边的乘积right*nums[n-1-i]…

搭建 Web 群集Haproxy

案例概述 Haproxy 是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如 LVS 和Nginx。相比较而言&#xff0c;LVS 性能最好&#xff0c;但是搭建相对复杂;Nginx 的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xf…

海量数据处理商用短链接生成器平台 - 10

第二十一章 短链服务冗余双写-链路测试和异常消息处理实战 第1集 冗余双写MQ架构-消费者配置自动创建队列和集群测试 简介&#xff1a; 冗余双写MQ架构-MQ消费者配置自动创建队列 controller-service层开发配置文件配置MQ ##----------rabbit配置-------------- spring.rab…

古彝文——唯一存活的世界六大古文字

关注我们 - 数字罗塞塔计划 - 早在五千年前&#xff0c;彝族的先祖就发明了十月太阳历&#xff0c;成为中华文明的重要创造者之一&#xff1b;同时&#xff0c;彝族的先祖也创制了古彝文&#xff0c;开创了独具特色的彝族文化。古彝文也被称为古夷文、传统彝文&#xff0c;是相…

Unity补完计划 之 动态控制TileMap

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1.TileMap &TileBase Unity - Scripting API: Tilemap &#xff0c;看手册内容太多了故介绍几个常用的公共方法 首…