Leetcode刷题-(26~35)-Java

news2024/11/18 5:53:30

算法是码农的基本功,也是各个大厂必考察的重点,让我们一起坚持写算法题吧。

遇事不决,可问春风,春风不语,即是本心。

我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可以啦,慢慢来,会很快,向前走,别回头。

目录

1、删除有序数组中的重复项

2、移除元素

3、找出字符串中第一个匹配项的下标

4、两数相除

5、串联所有单词的子串

6、下一个排列

7、最长有效括号

8、搜索旋转排序数组

9、在排序数组中查找元素的第一个与最后一个位置

10、搜索插入位置


1、删除有序数组中的重复项

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/

思路:双指针,左指针用于固定修改位置,右指针向后遍历,不相等啧修改元素。

class Solution {
    public int removeDuplicates(int[] nums) {
        // 数组是有序的,用双指针
        int left = 0 ;
        for(int i=1; i<nums.length; i++){
            if(nums[i] != nums[left]){
                nums[left+1] = nums[i] ;
                left ++ ;
            }
        }
        return left + 1 ;
    }
}

2、移除元素

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/remove-element/description/

思路:双指针,左侧指针标记位置,右侧向后遍历,不等于val则可以修改进行原地移除。

class Solution {
    public int removeElement(int[] nums, int val) {
       // 原地移除,也是用双指针
       int left = 0 ;
       for(int i=0; i<nums.length; i++){
        if(nums[i] != val){
            nums[left] = nums[i] ;
            left ++ ;
        }
       }
       return left  ;
    }
}

3、找出字符串中第一个匹配项的下标

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/

思路:本质上就是字符串匹配,其实对于Java等编程语言,可以通过indexOf这种api直接解决,当然考虑到是算法题,需要手写indexOf函数。

class Solution {
    public int strStr(String haystack, String needle) {
        return haystack.indexOf(needle) ;
    }
}

利用双指针模拟字符串匹配过程,匹配到就返回左侧指针的位置,匹配不到就返回-1。

class Solution {
    public int strStr(String haystack, String needle) {
        char [] c1 = haystack.toCharArray() ;
        char [] c2 = needle.toCharArray() ;
        int n = c1.length, m = c2.length ;
        for(int i=0; i<=n-m; i++){
            int b1 = i, b2 = 0 ;
            while(b2<m && c1[b1]==c2[b2]){
                b1 ++ ;
                b2 ++ ;
            }
            if(b2 == m){
                return i ;
            }
        }
        return -1 ;
    }
}
4、两数相除

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/divide-two-integers/description/

思路:要求不允许使用乘法、除法以及取余运算,硬生生把简单题复杂化,直接除一下就可以了,如下:

class Solution {
    public int divide(int dividend, int divisor) {
        long res = (long) dividend / (long) divisor ;
        if(res > Integer.MAX_VALUE){
            res = Integer.MAX_VALUE ;
        }
        if(res < Integer.MIN_VALUE){
            res = Integer.MIN_VALUE ;
        }
        return (int)res ;
    }
}

当然,上述的题解不是本题所考查的方面,通过循环减法,减的次数就是两数相除的结果。

class Solution {
    public int divide(int dividend, int divisor) {
       // 特殊的case处理
       if(dividend == Integer.MIN_VALUE ){
        if(divisor == -1){
            return Integer.MAX_VALUE;
        }
        if(divisor == 1){
            return Integer.MIN_VALUE ;
        }
       }
       if(divisor == 1){
        return dividend ;
       }
       // 判断最终结构的正负值
       int op = dividend < 0 ? -1 : 1 ;
       op = divisor < 0 ? -op : op ;

       // 转换为负数计算
       dividend = -Math.abs(dividend) ;
       divisor = -Math.abs(divisor) ;

       // 除法对应的思路是循环求减
       int res = 0 ;
       while(dividend <= divisor){
        dividend -= divisor ;
        res ++ ;
       }
       return res*op ;

    }
}
5、串联所有单词的子串
6、下一个排列
7、最长有效括号

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/longest-valid-parentheses/description/

思路:用栈存储下标模拟有效括号的匹配过程,先在栈中存储一个-1,如果遇到左括号,就将当前的括号位于字符串中的索引存储到栈中,如果遇到右括号,出栈,如果栈空,则重新记录栈顶索引,否则,计算最大连续匹配括号。

class Solution {
    public int longestValidParentheses(String s) {
        int max = 0 ;
        LinkedList<Integer> stack = new LinkedList<>() ;
        stack.push(-1) ;
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i) ;
            if(c == '('){
                stack.push(i) ;
            }else{
                stack.pop() ;
                if(stack.isEmpty()){
                    stack.push(i) ;
                }else{
                    max = Math.max(max, i-stack.peek()) ;
                }
            }
        }
        return max ;
    }
}

8、搜索旋转排序数组

题目链接:https://leetcode.cn/problems/search-in-rotated-sorted-array/description/icon-default.png?t=N7T8https://leetcode.cn/problems/search-in-rotated-sorted-array/description/

思路:二分查找的思想,数组长度为0或1的情况下,可以直接找出target的位置,数组长度大于1的情况下,为了保证O(logn)的时间复杂度,使用二分查找法:若中间值与目标值相等,则直接找到,否则,比较第一个元素与中间元素的大小,进一步比较第一个元素与目标元素以及中间元素与目标元素的大小。

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length ;
        if(n==0){
            return -1;
        }
        if(n==1){
            int res =  nums[0] == target  ? 0  : -1 ;
            return res ;
        }
        int left = 0, right = n - 1 ;
        // 二分查找的变种
        while(left<=right){
            int mid = (left + right) >> 1 ;
            if(nums[mid] == target){
                return mid ;
            }
            if(nums[0] <= nums[mid]){
                if(nums[0] <= target && nums[mid] > target){
                    right = mid - 1;
                }else{
                    left = mid + 1 ;
                }
            }else{
                if(nums[0] > target && nums[mid] < target){
                    left = mid + 1;
                }else{
                    right = mid - 1 ;
                }
            }
        }
        return -1 ;
    }
}

9、在排序数组中查找元素的第一个与最后一个位置

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/

思路:

Java版:

如果不考虑时间复杂度,使用O(n)的时间复杂度,则直接模拟标记法即可。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        boolean first = false, second = false ;
        int one = -1, two = -1 ;
        for(int i=0; i<nums.length; i++){
            if(nums[i] == target){
                if(first == false){
                    first = true ;
                    one = i ;
                }else{
                   two = i ;
                   second = true ;
                }
            }
        }
        if(first && second){
            return new int []{one, two} ;
        }
        if(first){
            return new int []{one, one} ;
        }
        return new int []{-1, -1} ;
    }
}

二分查找,从每次从中间找,初始化结果值为最大值,不停地更新,二分查找的第三个参数约束,当为true时,找出最左边相等的,当为false时,找到最右边的那个就不再找了。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int leftIndex = binarySearch(nums, target, true) ;
        int rightIndex = binarySearch(nums, target, false) - 1;
        if(leftIndex <= rightIndex && rightIndex < nums.length && nums[leftIndex] == target && nums[rightIndex] == target){
            return new int []{leftIndex, rightIndex} ;
        }
        return new int[]{-1, -1} ;
    }
    public int binarySearch(int [] nums, int target, boolean flag){
        int low = 0, high = nums.length - 1 ;
        int ans = nums.length  ;
        while(low <= high){
            int mid = (low + high) >> 1 ;
            if(nums[mid] > target || (flag && nums[mid] >= target)){
                high = mid - 1 ;
                ans = mid ;
            }else{
                low = mid + 1 ;
            }
        }
        return ans ;
    }
}

10、搜索插入位置

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/search-insert-position/description/

思路:初始化最终值为数组长度,二分查找过程中,当中间值大于等于目标值时,记录当前中间值所在位置为待插入的位置。

Java版:

class Solution {
    public int searchInsert(int[] nums, int target) {
        // 二分查找的思想
        int low = 0, high = nums.length - 1 , ans = nums.length ;
        while(low <= high){
            int mid = (low + high) >> 1 ;
            if(nums[mid] >= target){
                high = mid - 1 ;
                ans = mid  ;
            }else{
                low = mid + 1 ;
            }
        }
        return ans ;
    }
}

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

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

相关文章

【NTN 卫星通信】NTN的SSB波束探讨

1 概述 SSB是同步广播信道&#xff0c;用于小区搜索&#xff0c;主系统消息的发送。NR协议中定义了多种SSB波束格式&#xff0c;简述如下。   小区搜索是终端获取与小区的时间和频率同步并检测小区的物理层小区ID的过程。   为了进行小区搜索&#xff0c;UE接收以下同步信号…

C# 将 TextBox 绑定为 KindEditor 富文本

目录 关于 KindEditor 绑定设计 部署 KindEditor 实现代码 小结 关于 KindEditor KindEditor 基于JavaScript 编写&#xff0c;可以与众多WEB应用程序结合。KindEditor 依靠出色的用户体验和领先的技术提供富文本编辑功能&#xff0c;是一款非常受欢迎的HTML在线编辑器。…

Modelsim与Verilog入门

0.什么是Modelsim&#xff1f; Modelsim是一个支持多语言的仿真环境&#xff0c;比如我知道的Verilog和VHDL语言都可以在里边使用&#xff0c;这俩都是硬件描述语言&#xff1b; 即就是个软件&#xff0c;你可以用Verilog语言来写代码&#xff0c;然后编译&#xff0c;仿真出…

Spring AI ETL 流水线

先纠正 Spring AI 使用本地 Ollama Embeddings 中的一个错误&#xff0c;当启动 Ollama 之后&#xff0c;Windows会有托盘图标&#xff0c;此时已经启动了 Ollama 的服务&#xff0c;访问 Embedding 时不需要运行 ollama run gemma &#xff0c;只有访问 chat 时才需要启动一个…

轨迹跟踪与控制篇——Pure Pursuit纯跟踪算法

介绍 纯跟踪控制算法(Pure Pursuit)是一种典型的横向控制方法&#xff0c;最早由R.Wallace在1985年提出&#xff0c;该方法对参考轨迹的鲁棒性较好。 该算法的思想&#xff1a;基于当前车辆后轮中心位置&#xff0c;在参考路径上向 与 自车后轴中心距离ld(自定义)的位置处 匹配…

牛客-小乐乐与欧几里得

目录 题目 描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 示例2 解题 题目 描述 小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数&#xff0c;但是他竟然不会求两个正整数的最大公约数与最小公倍数之和&#xff0c;请你帮助他解决这个问题。 …

工业现场ModbusTCP转EtherNETIP网关引领生物现场领新浪潮

生物质发生器是一种能够产生、培养生物的设备。客户现场需要将生物发生器连接到罗克韦尔系统&#xff0c;但是二者协议无法直接通讯&#xff0c;需要通过开疆智能ModbusTCP转Ethernet/IP网关将两者进行通讯连接&#xff0c;生物质发生器以其独特的工作原理和优势&#xff0c;使…

强固型国产化工业电脑,在电子看板行业应用,机器视觉在汽车产线行业应用

电子看板行业应用 智能电子看板的核心是通过实现工厂的全面可视化、自动化管理&#xff0c;最终达到提高效率、降低成本及提高产品质量的目标。电子看板硬件主要有两部分组成&#xff1a;微型工业计算机&#xff0c;显示终端&#xff08;平板电视、LCD&#xff09; 方案需求 …

【c基础】文件操作

1.fopen和fclose函数 函数原型 FILE *fopen(const char *path, const char *mode); 参数解释&#xff1a; 返回值&#xff1a;fopen打开成功&#xff0c;则返回有效file的有效地址&#xff0c;失败返回NULL。path是文件路径&#xff0c;可以相对路径&#xff0c;可以绝对路径…

《黑羊效应》一群好人欺负一个好人,其他好人却坐视不管的诡谲现象 - 三余书屋 3ysw.net

黑羊效应&#xff1a;一群好人欺负一个好人&#xff0c;其他好人却坐视不管的诡谲现象 大家好&#xff0c;今天我们要解读的书是《黑羊效应》。黑羊效应是一种心理陷阱&#xff0c;指的是一群好人欺负一个好人&#xff0c;而其他好人却坐视不理。我们每个人或多或少都目睹过或…

理解JMM

JMM 对volatile的理解 volatile 是java虚拟机提供轻量级的同步机制 1、保证可见性 2、不保证原子性 3、禁止指令重排 那么可见性与JMM相关 什么是JMM Java内存模型&#xff0c;不存在的东西&#xff0c;是一个概念&#xff0c;是一个约定 线程加锁前&#xff0c;必须读取…

存储过程的使用(二)

目录 带 OUT 参数的存储过程 输入一个编号&#xff0c;查询数据表 emp中是否有这个编号&#xff0c;如果有返回对应员工姓名&#xff0c;如果没有&#xff0c;则提示没有对应员工 使用 EXEC 命令或者 PRINT执行含有 OUT参数的存储过程 使用 PL/SQL 块编辑程序调用含有 OUT …

centos修改启动项加载不同内核

一.背景&#xff1a; 虚拟机中有时需要编译好几个内核版本&#xff0c;make install后系统存在几个内核版本。需要再哪个内核上开发调试就启动特定的内核版本。这就需要修改启动时的内核版本&#xff0c;再物理机或虚拟机启动时可以上下键选择。但有时是docket云环境中或远程时…

葡萄书--图注意力网络

同质图中的注意力网络 注意力网络 GAT 核心就是对于每个顶点都计算其与邻居节点的注意力系数&#xff0c;通过注意力系数来聚合节点的特征&#xff0c;而非认为每个邻居节点的贡献程度都是相同的 单头注意力机制 为了计算注意力权重 eij​&#xff0c;我们首先将即节点特征…

移动Web学习09-响应式布局bootstrap案例开发

3、综合案例-AlloyTeam移动全端 准备工作 HTML 结构 <title>腾讯全端</title> <link rel"shortcut icon" href"favicon.ico" type"image/x-icon"> <!-- 层叠性&#xff1a;咱们的css 要 层叠 框架的 --> <link rel&…

JAVA 项目<果园之窗>_2

上节主要是理论流程&#xff0c;这次直接用实际例子过一遍整个流程 目标是向数据库添加一个员工 上述是前端页面&#xff0c;点击保存 浏览器向我后端发送http请求 后端这一部分专门接收employee请求 在这里对http post请求进行转换成JAVA数据&#xff0c;并处理数据&#xff…

安装zlmediakit和wvp-pro

通过docker安装zlmediakit&#xff0c;并单独启动wvp-pro.jar - zlmediakit安装 zlmediakit安装比较依赖环境和系统配置&#xff0c;所以这里直接使用docker的方式来安装。 docke pull拉取镜像 docker pull zlmediakit/zlmediakit:master使用下边命令先运行起来 sudo docke…

Linux 下安装MySQL 5.7与 8.0详情

官网资源下载 1、检查 /tmp 临时目录权限&#xff0c;将 /tmp 目录及所有子目录和文件的权限设置为所有用户可读、写和执行 [rootlocalhost ~]# chmod -R 777 /tmp2、安装前检查相关依赖 2.1、查找是否安装了 libaio 包。libaio 是 Linux 下异步 I/O 库的一个实现&#xff0…

华为ensp中rip和ospf路由重分发 原理及配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月20日20点21分 路由重分发&#xff08;Route Redistribution&#xff09;是指路由器将从一种路由协议学习到的路由信息&#xff0c;通过另一种路由协议通告出去的功…

汇舟问卷:国外问卷调查做题完整步骤细节展示

大家好&#xff0c;我是汇舟问卷。想要做国外问卷调查&#xff0c;搭建国外的环境是必不可少的&#xff0c;今天给大家讲解一下搭建国外环境的完整步骤&#xff0c;只要按照步骤一步步操作就一定能把环境搭建出来​。 一、安装辅助软件 需要先下载对应的软件进行安装&#xf…