Leetcode刷题-(26~35)-Java

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

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

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

目录

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 ;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之排序了如指掌(三)

目录 题外话 正题 快速排序 Hoare法 Hoare法思路 Hoare法代码详解 挖坑法 挖坑法思路 挖坑法代码 前后指针法 前后指针法思路 前后指针法代码 小结 题外话 我们接着把没有写完的排序内容完成,快速排序其实大同小异,大家好好把思路整理一下 正题 快速排序 快速排序一…

WideDeep

这里写目录标题 1. 背景2. 贡献3 模型结构&#xff08;1&#xff09;任务定义&#xff08;2&#xff09;The Wide Component&#xff08;3&#xff09;The Deep Component&#xff08;4&#xff09;联合训练Wide和Deep Model 4. 参考 1. 背景 (1) 广义线性回归通常被用于推荐模…

树莓派+Openwrt连接校园网,打破校园网设备限制

前言 因为本校学生校园网只允许最多三个设备登录&#xff0c;对于同时拥有多个联网设备的我十分不友好&#xff0c;而且大多单片机如esp32的wifi模块是只允许一般的WPA/WPA2认证的&#xff0c;是不支持校园网的portal认证。所以我决定搞一个路由器。 然后我上网买了一个TP-Li…

Android Studio 新建Android13 代码提示Build Tools revision XX is corrupted无法编译解决

Android Studio 新建Android13 代码提示Build Tools revision XX is corrupted无法编译解决 文章目录 Android Studio 新建Android13 代码提示Build Tools revision XX is corrupted无法编译解决一、前言二、分析解决1、原因分析2、解决方法 三、其他1、Android13 新项目无法编…

采用matplotlib可视化kitti

配置kitti_object_vis没成功&#xff0c;用kitti_object_vis的一些函数加上matplotlib进行可视化 import numpy as np import matplotlib.pyplot as pltimport numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def roty(t):"&quo…

JavaWeb-登录校验

会话技术 浏览器使用的是http协议&#xff0c;多次请求间数据是不能共享的&#xff0c;例如我们要去访问用户数据的接口&#xff0c;但这时候用户是否已经登入了呢&#xff1f;是不知道的&#xff0c;为了解决这个问题&#xff0c;于是引入了会话跟踪技术。 会话&#xff1a;…

05—js对象

一、初识对象 JavaScript是面向对象编程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;语言。 面对象是一种复合值&#xff1a;它将很多值集合在一起&#xff0c;可通过名字访问这些值。对象也可看做一种无序的数据集合&#xff0c;由若干个“键值对”…

iced 入门一

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

基于ssm的企业在线培训系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装企业在线培训系统软件来发挥其高效地信息处理的作用&#x…

每日一题

腐烂的苹果_牛客题霸_牛客网 思路分析:广度优先遍历&#xff0c;找到所有腐烂的苹果同时向四方扩散&#xff0c;就是第一轮把所有腐烂的苹果加入队列中&#xff0c;这就跟MQ的消息队列的原理差不多&#xff0c;第一次记录队列的长度&#xff0c;广度遍历一次&#xff0c;长度--…

第一个STM32F767IGT6核心板

一. 制作原因 起先是因为参加计算机设计大赛准备的板子&#xff0c;其作用是连接OV5640摄像头来识别车牌号&#xff0c;主要外设有摄像头&#xff0c;SDRAM&#xff0c;网口等。 二. 原理图和PCB 原理图 PCB 三. 测试 1. 测试SDRAM功能 按下按键我们可以在串口中看到内存…

【基础IO】谈谈动静态库(怒肝7000字)

文章目录 前言实验代码样例静态库生成一个静态库归档工具ar静态库的链接 动态库创建动态库加载动态库 动静态链接静态链接动态链接动静态链接的优缺点 前言 在软件开发中&#xff0c;库&#xff08;Library&#xff09;是一种方式&#xff0c;可以将代码打包成可重用的格式&…

【C语言】内存函数-memcpy-memmove-memset...用法及实现,沉淀自己!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. memcpy函数使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 1. memcpy函数使用和模拟实现 <string.h>-------…

机器学习理论基础—神经网络算法公式学习

机器学习理论基础—神经网络公式学习 M-P神经元 M-P神经元&#xff08;一个用来模拟生物行为的数学模型&#xff09;&#xff1a;接收n个输入(通常是来自其他神经 元)&#xff0c;并给各个输入赋予权重计算加权和&#xff0c;然后和自身特有的阈值进行比较 (作减法&#xff0…

pytorch-MNIST测试实战

这里写目录标题 1. 为什么test2. 如何做test3. 什么时候做test4. 完整代码 1. 为什么test 如下图&#xff1a;上下两幅图中蓝色分别表示train的accuracy和loss&#xff0c;黄色表示test的accuracy和loss&#xff0c;如果单纯看train的accuracy和loss曲线就会认为模型已经train…

【优质书籍推荐】Vue.js+Node.js全栈开发实战

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

von Mises-Fisher Distribution (代码解析)

torch.distribution 中包含了很多概率分布的实现&#xff0c;本文首先通过均匀分布来说明 Distribution 的具体用法, 然后再解释 von Mises-Fisher 分布的实现, 其公式推导见 von Mises-Fisher Distribution. 1. torch.distribution.Distribution 以下是 Uniform 的源码: cl…

怎么使用JMeter进行性能测试?

一、简介 JMeter是Apache软件基金会下的一款开源的性能测试工具&#xff0c;完全由Java开发。它专注于对我们应用程序进行负载测试和性能测量&#xff0c;最初设计用于web应用程序&#xff0c;现在已经扩展到其他测试功能&#xff0c;比如&#xff1a;FTP、Database和LDAP等。…

Vue 3 项目构建与效率提升:vite-plugin-vue-setup-extend 插件应用指南

一、Vue3项目创建 前提是已安装Node.js&#xff08;点击跳转Node官网&#xff09; npm create vuelatest这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示&#xff1a; ✔ Projec…

跟着Carl大佬学leetcode之977 有序数组的平方

来点强调&#xff0c;刷题是按照代码随想录的顺序进行的&#xff0c;链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程&#xff0c;就看到题目自己先上手试试&#xff0c;然后看程序员Carl大佬的解释&#xff0c;自己再敲一遍修修补补&#xff0c;练…