春招冲刺百题计划|双指针

news2024/9/22 9:43:50

Java基础复习

  1. Java数组的声明与初始化
  2. Java ArrayList
  3. Java HashMap
  4. Java String 类
  5. Java LinkedList
  6. Java Deque继承LinkedList
  7. Java Set
  8. Java 队列
  9. 优先队列:第二题用到了
  10. Java数组划分
  11. Java数组转ArrayList
  12. String 转数字
  13. String

这一部分,代码随想录写得超级好!(快慢指针)

第一题:26. 删除有序数组中的重复项在这里插入图片描述

class Solution {
    public int removeDuplicates(int[] nums) {
        // 快慢指针:慢指针负责确定位置,快指针负责寻找元素
        int slow = 0;
        for(int fast=0; fast<nums.length; fast++){
            if(nums[slow]!=nums[fast]){
                nums[++slow] = nums[fast];
            }
        }
        return slow+1;
    }
}

第二题:31. 下一个排列在这里插入图片描述

这题解出来,全凭能不能琢磨出来规律。个人觉得还是很复杂的。
给定一个数组,除非是降序的(最大的排列了),就直接反转。
其他情况,要按照以下步骤来执行:
1.从尾部开始查找,找到第一个下降的点a[i]
2.从尾部开始查找,找到最后一个满足a[j]>a[i]的点a[j],交换两者。
3.翻转a[i+1:n-1]。

class Solution {
    public void nextPermutation(int[] nums) {
        int n = nums.length, k = n - 1;
        while (k - 1 >= 0 && nums[k - 1] >= nums[k]) k--;
        if (k == 0) {
            reverse(nums, 0, n - 1);
        } else {
            int u = k;
            while (u + 1 < n && nums[u + 1] > nums[k - 1]) u++;
            swap(nums, k - 1, u);
            reverse(nums, k, n - 1);
        }
    }
    void reverse(int[] nums, int a, int b) {
        int l = a, r = b;
        while (l < r) swap(nums, l++, r--);
    }
    void swap(int[] nums, int a, int b) {
        int c = nums[a];
        nums[a] = nums[b];
        nums[b] = c;
    }
}

但是,这题和双指针有什么关系呢?

第三题:88. 合并两个有序数组

在这里插入图片描述

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if(n==0){
            return;
        }
        if(m==0){
            for(int i=m; i<n+m; i++){
                nums1[i] = nums2[i-m];
            }
        }
        int p1=m-1, p2=n-1, p3=n+m-1;
        while(p1>=0&&p2>=0){
            if(nums1[p1]>nums2[p2]){
                nums1[p3--] = nums1[p1--];
            }else{
                nums1[p3--] = nums2[p2--];
            }
        }
        if(p1>=0){
            for(int i=p3; i>=0; i--){
                nums1[i] = nums1[p1--];
            }
        }else{
            for(int i=p3; i>=0; i--){
                nums1[i] = nums2[p2--];
            }
        }
        

    }
}

从后往前。如果从前往后会遇到nums1的元素被覆盖的问题,要是再来一个数组存储的话,还不如直接建一个sorted数组。因此,从后往前,保证nums1的元素不被覆盖。

第四题:189. 轮转数组

在这里插入图片描述
有一个额外的数组来辅助是最简单的,难点就在于如何原地轮转。
以下是额外数组的做法:

class Solution {
    public void rotate(int[] nums, int k) {
        //最简单就是额外来一个数组,就非常简单。
        int[] results = new int[nums.length];
        k = k%nums.length;
        for(int i=0; i<nums.length; i++){
            results[(i+k)%nums.length] = nums[i];//向右k,就是向左n-k。
        }
        for(int i=0; i<nums.length; i++){
            nums[i] = results[i];
        }
    }
}

翻转一下!(这一题,还有一个推导的解法用到了指针的概念,但是!你怎么能放在双指针章节迷惑人!!!)
在这里插入图片描述

class Solution {
    //官方题解:找规律,能够环状替换,要数学推导,不管了。
    //官方题解2:数组翻转(好像经常遇到。)
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }
    public void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start += 1;
            end -= 1;
        }
    }

}

第五题:165. 比较版本号

在这里插入图片描述

class Solution {
    public int compareVersion(String version1, String version2) {
        //先划分开来
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");

        //转成数字,并对齐长度
        ArrayList<Integer> al1 = new ArrayList<>();
        ArrayList<Integer> al2 = new ArrayList<>();

        for(int i=0; i<v1.length; i++){
            al1.add(Integer.parseInt(v1[i]));
        }
        for(int i=0; i<v2.length; i++){
            al2.add(Integer.parseInt(v2[i]));//String 如何转数字
        }
        int n = Math.max(v1.length, v2.length);
        while(al1.size()<n) al1.add(0);
        while(al2.size()<n) al2.add(0);
        //比较
        for(int i=0; i<n; i++){
            if(al1.get(i)>al2.get(i)){
                return 1;
            }
            if(al1.get(i)<al2.get(i)){
                return -1;
            }
        }
        return 0;
        //Arrays.toString(v1)
    }
}

双指针的目的是为了节省空间。个人觉得题解的代码很优雅!

class Solution {
    public int compareVersion(String version1, String version2) {
        int n = version1.length(), m = version2.length();
        int i = 0, j = 0;
        while (i < n || j < m) {
            int x = 0;
            for (; i < n && version1.charAt(i) != '.'; ++i) {
                x = x * 10 + version1.charAt(i) - '0';
            }
            ++i; // 跳过点号
            int y = 0;
            for (; j < m && version2.charAt(j) != '.'; ++j) {
                y = y * 10 + version2.charAt(j) - '0';
            }
            ++j; // 跳过点号
            if (x != y) {
                return x > y ? 1 : -1;
            }
        }
        return 0;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/compare-version-numbers/solutions/970416/bi-jiao-ban-ben-hao-by-leetcode-solution-k6wi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第六题:125. 验证回文串

算是超经典题目了。
在这里插入图片描述

class Solution {
    public boolean isPalindrome(String s) {
        if(s.length()==0){
            return true;
        }
        //还要先处理。
        s = s.toLowerCase();
        int l=0, r=s.length()-1;
        while(l<s.length()&&(s.charAt(l)>'z'||s.charAt(l)<'a')&&(s.charAt(l)>'9'||s.charAt(l)<'0')) l++;
        while(r>=0&&(s.charAt(r)>'z'||s.charAt(r)<'a')&&(s.charAt(r)>'9'||s.charAt(r)<'0')) r--;
        while(l<r){
            System.out.println(s.charAt(l) + " " + s.charAt(r));
            if(s.charAt(l)!=s.charAt(r)){
                return false;
            }
            l++;
            r--;
            while(l<s.length()&&(s.charAt(l)>'z'||s.charAt(l)<'a')&&(s.charAt(l)>'9'||s.charAt(l)<'0')) l++;
            while(r>=0&&(s.charAt(r)>'z'||s.charAt(r)<'a')&&(s.charAt(r)>'9'||s.charAt(r)<'0')) r--;
        }
        return true;
    }
}

第七题:295. 数据流的中位数

在这里插入图片描述
难度在于插入后排序,取出中位数定位。

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

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

相关文章

哪些场景下适合使用人工智能作词软件来写歌词

以下是一些适合使用人工智能作词软件的场景&#xff1a; 软件我们选用“妙笔生词”智能写歌词软件&#xff08;veve299&#xff09;来操作。 1.创作灵感枯竭时&#xff1a;当创作者陷入思维困境&#xff0c;找不到新的创意和方向&#xff0c;人工智能作词软件可以快速提供一些…

Learning vtkjs之hello vtk

学习vtkjs 最近由于工作需要&#xff0c;开始学习vtkjs的相关内容&#xff0c;发现其实在医疗和工业领域&#xff0c;这个vtk的库的example还是非常有帮助&#xff0c;但是实际用的一些开发工具&#xff0c;或者研发生态却没有three的好&#xff0c;也就是能抄写的东西不多&am…

PanTools v1.0.27 多网盘批量管理、遍历分享、转存、重命名、复制...

一款针对多个热门网盘的文件管理、批量分享、批量转存、批量重命名、批量复制、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者、网盘拉新等&#xff0c;对于管理名下具有多个网盘多个账号具有…

昇思25天学习打卡营第20天|CycleGAN图像风格迁移互换

模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。…

3D问界-深入理解骨骼绑定与蒙皮绑定在三维动画中的角色

问题提出&#xff1a;什么是蒙皮绑定&#xff0c;什么是骨骼绑定 蒙皮绑定&#xff08;Skinning&#xff09;和骨骼绑定&#xff08;Bone Binding&#xff09;通常是在计算机图形学和动画制作中使用的术语&#xff0c;用来描述将模型或角色的几何形状与骨骼系统相关联的过程。这…

层序遍历及其应用

我们先看一道问题&#xff0c;将一棵树按照层序遍历将他列出来&#xff0c;如下图所示&#xff1a; 我们想一下&#xff0c;按照层序遍历的顺序应该是 1243567 。按照这个设想&#xff0c;我给大家讲解一下这个整体过程。 层序遍历介绍 层序遍历就是将树放入队列中&#x…

springboot社区垃圾回收处理小程序-计算机毕业设计源码71905

摘要 在数字化高速发展的今天&#xff0c;随着Spring Boot等轻量级框架的广泛应用&#xff0c;各种小程序、微服务如雨后春笋般涌现&#xff0c;极大地丰富了我们的软件生态系统。然而&#xff0c;伴随着这些应用的迅速增加&#xff0c;垃圾回收处理成为了一个不可忽视的问题。…

TensorFlow系列:第四讲:MobileNetV2实战

一. 加载数据集 编写工具类&#xff0c;实现数据集的加载 import keras""" 加载数据集工具类 """class DatasetLoader:def __init__(self, path_url, image_size(224, 224), batch_size32, class_modecategorical):self.path_url path_urlself…

PostgreSQL日志文件配置,记录所有操作记录

为了更详细的记录PostgreSQL 的运行日志&#xff0c;我们一般需要修改PostgreSQL 默认的配置文件&#xff0c;这里整理了一些常用的配置 修改配置文件 打开 PostgreSQL 配置文件 postgresql.conf。该文件通常位于 PostgreSQL 安装目录下的 data 文件夹中。 找到并修改以下配…

1.10-改进CBOW模型的学习

文章目录 0引言1 cupy包的安装2解决VScode中matplotlib绘图不显示的问题3 CBOW模型学习的实现4 CBOW模型对更复杂模式的捕捉5单词向量的评价方法6总结 0引言 本节将前面实现的改进的CBOW模型在PTB数据集上跑一遍由于希望跟书上一样调用GPU&#xff0c;因此需要安装cupy包&…

前端Canvas入门——一些注意事项

创建渐变的三种方法&#xff1a; createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变&#xff08;放射性渐变&#xff09; createConicGradient() - 锥形渐变 这三种的核心观点都是&#xff1a; 创建一个gradient对象&#xff0c;然后调用addColorStop()方法…

【软件测试】自动化测试常用函数 -- 详解

一、WebDriver API 一个简单自动化脚本的构成&#xff1a; 脚本解析 # coding utf-8 from selenium import webdriver import time browser webdriver.Firefox() time.sleep(3) browser.get("http://www.baidu.com") time.sleep(3) browser.find_element_by_id(…

Photoshop

彩色转灰度&#xff1a;ctrlshiftu 背景转黑色&#xff1a; 魔术棒容差10 shift连选 shiftF5&#xff08;填充&#xff09;钢笔选择 路径 工作路径 将路径作为选区载入 点回图层 按ctrlx删除选区 待更新

[C++]——同步异步日志系统(5)

同步异步日志系统 一、日志消息格式化设计1.1 格式化子项类的定义和实现1.2 格式化类的定义和实现 二、日志落地类设计2.1 日志落地模块功能实现与测试2.2 日志落地模块功能功能扩展 一、日志消息格式化设计 日志格式化模块的作用&#xff1a;对日志消息进行格式化&#xff0c…

Windows 子系统WSL2 Ubuntu使用事项

Windows 子系统WSL2 Ubuntu使用事项 要使外部设备能够访问运行在 Windows 上的 WSL2 实例&#xff0c;你可以端口转发的方法。由于 WSL2 是在虚拟化环境中运行&#xff0c;直接访问比 WSL1 更为复杂. 1 如何实现子系统可以被外部系统SSH 1.1 端口转发: 通过windows代理WSL2的…

微信视频号的视频怎么下载到本地?快速教你下载视频号视频

天来说说市面上常见的微信视频号视频下载工具&#xff0c;教大家快速下载视频号视频&#xff01; 方法一&#xff1a;缓存方法 该方法来源早期视频技术&#xff0c;因早期无法将大量视频通过网络存储&#xff0c;故而会有缓存视频文件到手机&#xff0c;其目的为了提高用户体验…

stm32入门-----初识stm32

目录 前言 ARM stm32 1.stm32家族 2.stm32的外设资源 3.命名规则 4.系统结构 5.引脚定义 6.启动配置 7.STM32F103C8T6芯片 8.STM32F103C8T6芯片原理图与最小系统电路 前言 已经很久没跟新了&#xff0c;上次发文的时候是好几个月之前了&#xff0c;现在我是想去学习st…

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则&#xff08;切片&#xff09; 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载&#xff0c;隐藏&#xff0c;重写的区别 override和final 多态原理 继承 继承的…

FinalShell介绍,安装与应用

目录 一、什么是finalshell 二、finalshell功能 三、为什么要用finalshell 四、安装finalshell 五、finalshell使用 1.添加连接 获取虚拟ip地址 2.启动连接 一、什么是finalshell FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工…

在RHEL9.4上启用SFTP服务

FTP存在的不足&#xff1a; 明文传输 FTP传输的数据&#xff08;包括用户名、密码和文件内容&#xff09;都是明文的&#xff0c;这意味着数据可以被网络上的任何人截获并读取。没有内置的加密机制&#xff0c;容易受到中间人攻击。 被动模式下的端口问题 FTP的被动模式需要…