Leetcode刷题-(11~15)-Java+Python+JavaScript

news2024/10/7 16:18:42

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

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

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

目录

1.盛最多水的容器

2.整数转罗马数字

3.罗马数字转整数

4.最长公共前缀

5.三数之和


1.盛最多水的容器

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/container-with-most-water/description/

思路:双指针,从两侧往中间遍历,每次短的那个边往中间走,计算整个过程中最大的面积即可。

Java版:

class Solution {
    public int maxArea(int[] height) {
     int max = 0 ;
     int left = 0, right = height.length - 1 ;
     while(left < right){
         int h = Math.min(height[left], height[right]) ;
         int area = h * (right - left) ;
         max = max < area ? area : max ; 
         while(left < right && height[left] <= h){
             left ++ ;
         }
         while(left < right && height[right] <= h){
             right -- ;
         }
     }
     return max ;
}
}

Python版:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        max = 0 
        left = 0
        right = len(height) - 1
        while left < right:
            h = min(height[left], height[right])
            area = h * (right - left)
            if area >= max:
                max = area
            while left < right and height[left] <= h:
                left += 1
            while left < right and height[right] <= h:
                right -= 1
        return max 

Js版:

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    let max = 0 
    let left = 0, right = height.length - 1
    while(left < right){
        const h = Math.min(height[left], height[right])
        const area = h * (right - left)
        max = max <= area ? area : max 
        while(left < right && height[left] <= h){
            left ++ 
        }
        while(left < right && height[right] <= h){
            right -- 
        }
    }
    return max 
};
2.整数转罗马数字

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/integer-to-roman/description/

思路:一共13种罗马数字,针对当前数字,每次找出不大于当前的数字的最大罗马数字,每次拼接该罗马数字,当前数字减去对应的值。

Java版:

class Solution {
    public String intToRoman(int num) {
        int [] key = {1,4,5,9,10,40,50,90,100,400,500,900,1000} ;
        String [] value = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"} ;
        String ans = "" ;
        for(int i=key.length-1; i>=0; i--){
             while(key[i] <= num){
                 num -= key[i] ;
                 ans += value[i] ;
             }
            }
        return ans ;
    }
}

Python版:

class Solution:
    def intToRoman(self, num: int) -> str:
        key = [1,4,5,9,10,40,50,90,100,400,500,900,1000]
        value = ["I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"]
        key.reverse()
        value.reverse()
        s = ""
        for i in range(len(key)):
            element = key[i]
            while num >= element:
                num -= element
                s += value[i]
        return s

Js版:

/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function(num) {
    const key = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
    const value = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
    let res = ""
    for(let i=0; i<key.length; i++){
        while(num >= key[i]){
            res += value[i] 
            num -= key[i] 
        }
    } 
    return res 
};
3.罗马数字转整数

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/roman-to-integer/description/

思路:从后向前遍历字符串,判断当前字符代表的数字是否大于等于上一个,满足条件就累加,否则就累减,每次更新当前字符所代表的值以及上一个字符所代表的值。

Java版:

class Solution {
    public int romanToInt(String s) {
        int value =0,  num1 = 0,  num2 = 0 ;
        for(int i=s.length()-1; i>=0; i--){
            switch(s.charAt(i)){
                case 'I' : num1 = 1; break;
                case 'V' : num1 = 5; break ;
                case 'X' : num1 = 10; break ;
                case 'L' : num1 = 50; break ;
                case 'C' : num1 = 100; break ;
                case 'D' : num1 = 500; break ;
                case 'M': num1 = 1000; break ;
            }
            if(num1 >= num2){
                value += num1 ;
            }else{
                value -= num1 ;
            }
            num2 = num1 ;
        }


        return value ;
    }
}

Python版:

class Solution:
    def romanToInt(self, s: str) -> int:
        value = num1 = num2 = 0 
        s1 = s[::-1]
        for c in s1:
            if c == 'I': num1 = 1
            if c == 'V': num1 = 5
            if c == 'X': num1 = 10
            if c == 'L': num1 = 50 
            if c == 'C': num1 = 100
            if c=='D': num1 = 500
            if c=='M': num1 = 1000
            if num1 >= num2:
                value += num1
            else:
                value -= num1 
            num2 = num1
        return value 

JS版:

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    let value = 0, num1 = 0, num2 = 0
    for(let i=s.length-1; i>=0; i--){
        switch(s.charAt(i)){
            case 'I' : num1 = 1; break ;
            case 'V' : num1 = 5; break ;
            case 'X' : num1 = 10; break;
            case 'L': num1 = 50; break ;
            case 'C': num1 = 100; break ;
            case 'D': num1 = 500; break ;
            case 'M': num1 = 1000; break ;
        }
        if(num1 >= num2){
            value += num1 
        }else{
            value -= num1 
        }
        num2 = num1 
    }
    return value 
};

4.最长公共前缀

题目连接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/longest-common-prefix/description/

思路:写一个求两个字符串公共前缀和的方法,然后用该方法依次比对当前公共前缀与下一个字符串的公共前缀即可。
Java版:

class Solution {
    public String commonPrefix(String s1, String s2){
        if(s1.length() > s2.length()){
            String tmp = s1 ;
            s1 = s2 ;
            s2 = tmp ;
        }
        for(int i=0; i<s1.length(); i++){
            if(s1.charAt(i) != s2.charAt(i)){
                return s1.substring(0,i) ;
            }
        }
        return s1 ;
    }
    public String longestCommonPrefix(String[] strs) {
      String ans = strs[0] ;
      for(int i=1; i<strs.length; i++){
          ans = commonPrefix(ans, strs[i]) ;
      }
      return ans ;
    }
}

Python版:

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        prefix = strs[0]
        for i in range(1,len(strs)):
            prefix = self.commonPrefix(prefix, strs[i])
        return prefix
    def commonPrefix(self, s1, s2):
        if len(s1) > len(s2):
            tmp = s1
            s1 = s2
            s2 = tmp
        for i in range(len(s1)):
            if s1[i] != s2[i]:
                return s1[0:i]
        return s1
        

Js版:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    let prefix = strs[0]
    for(let i=1; i<strs.length; i++){
        prefix = commonPrefix(prefix, strs[i])
    }
    return prefix
};
var commonPrefix = function(s1, s2){
    if(s1.length > s2.length){
        const tmp = s1 
        s1 = s2 
        s2 = tmp 
    }
    for(let i=0; i<s1.length; i++){
        if(s1.charAt(i) != s2.charAt(i)){
            return s1.substring(0,i) 
        }
    }
    return s1 
};

5.三数之和

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/3sum/description/

思路:排序+双指针,当前指针固定最左侧,另外两个指针分别在中间和右侧。

Java版:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums) ;
        List<List<Integer>>  ans = new ArrayList<>() ;
        for(int i=0; i<nums.length-1; i++){
            int cur = nums[i] ;
            int left = i+1, right = nums.length - 1 ;
            if(i>0 && nums[i] == nums[i-1]){
                continue ;
            }
            while(left < right){
                int res = cur + nums[left] + nums[right] ;
               
                if(res == 0){
                    List<Integer> tmp = new ArrayList<>() ;
                    tmp.add(nums[left]) ;
                    tmp.add(cur) ;
                    tmp.add(nums[right]) ;
                    
                    while(left < right && nums[left] == nums[left+1]){
                        left ++ ;
                    }
                    while(left < right && nums[right] == nums[right - 1]){
                        right -- ;
                    }
                    ans.add(tmp) ;
                    left ++ ;
                    right -- ;
                }else if(res > 0){
                    right -- ;
                }else{
                    left ++ ;
                }
            }

        }
        return ans ;
    }
}

python版:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        ans = []
        nums.sort()
        for i in range(len(nums)):
            if i>0 and nums[i] == nums[i-1]:
                continue
            cur = nums[i]
            left = i+1
            right = len(nums) - 1
            while left < right:
                res = cur + nums[left] + nums[right]
                if res == 0:
                    tmp = []
                    tmp.append(cur)
                    tmp.append(nums[left])
                    tmp.append(nums[right])
                    while left < right and nums[left] == nums[left+1]:
                        left += 1
                    while left < right and nums[right] == nums[right-1]:
                        right -= 1
                    ans.append(tmp)
                    left += 1
                    right -= 1
                elif res > 0:
                    right -= 1
                else:
                    left += 1
        return ans

Js版:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    const ans = []
    // js对负数进行排序
    const nums1 = nums.sort(function(a,b){
        return a - b
    })
    for(let i=0; i<nums1.length; i++){
        if(i>0 && nums1[i-1] == nums1[i]){
            continue 
        }
        let cur =  nums1[i]
        let left = i + 1
        let right = nums1.length - 1
        while(left < right){
            const res = cur + nums1[left] + nums1[right]
            if(res == 0){
                tmp = []
                tmp.push(cur)
                tmp.push(nums1[left])
                tmp.push(nums1[right])
                while(left < right && nums1[left] == nums1[left + 1]){
                    left ++
                }
                while(left < right && nums1[right] == nums1[right - 1]){
                    right --
                }
                ans.push(tmp)
                left ++ 
                right --
            }else if(res > 0){
                right -- 
            }else{
                left ++ 
            }
        }
    }
    return ans
};

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

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

相关文章

关于可变类型和不可变类型的探究

个人猜想&#xff08;很遗憾失败了&#xff09; 在硬盘或者系统中存在一个字符集 如果存在硬盘中&#xff0c;那么硬盘出厂的时候他的字符集所占用的空间就已经确定了。 如果存在于系统的话&#xff0c;硬盘应该在出厂的时候为系统设置一个存储系统字符集的地方。在安装系统…

【Scala】1. 变量和数据类型

1. 变量和数据类型 1.1 for begining —— hello world 新建hello.scala文件&#xff0c;注意object名字与文件名一致。 object hello { def main(args:Array[String]): Unit { println("hello world!") } }运行后打印结果如下&#xff1a; hello world!Pr…

go 版本 LeeCode 刷题 在线

https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0001.Two-Sum/ 参考 https://github.com/anzhihe/learning/tree/master/shell/book/abs-3.9.1_cn

Java Character源码剖析

Character类除了封装了一个char外&#xff0c;还封装了Unicode字符级别的各种操作&#xff0c;是Java文本处理的基础。下面结合源码分析Character的贡献。 Unicode 也许你没听过Unicode&#xff0c;但应该见过UTF-8。UTF-8&#xff08;8-bit Unicode Transformation Format&a…

LeetCode:14.最长公共前缀

14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 思路&#xff1a; 代码有限注释&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路&#xff1a; 仅有一种&#xff0c;LeetCode的四种解法&#xff0c;三种都是来水的&#…

SpringBoot3整合Mybatis-Plus,自定义动态数据源starter

文章目录 前言正文一、项目总览二、核心代码展示2.1 自定义AbstractRoutingDataSource2.2 动态数据源DynamicDataSource2.3 动态数据源自动配置2.4 动态数据源上下文DynamicDataSourceContextHolder2.5 动态数据源修改注解定义2.6 修改切面DynamicDataSourceAspect2.7 动态数据…

c++设计模式之代理模式

作用 代理模式主要用于&#xff0c;通过代理类&#xff0c;来控制实际对象的访问权限 案例 class VideoSite { public:virtual void freeVideo()0;virtual void vipVideo()0;virtual void trickVideo()0; };class FixBugVideoSite:public VideoSite { public:void freeVideo()…

AWS创建快照定期备份

备注&#xff1a;aws有快照定期备份工具&#xff0c;名字叫【生命周期管理器】 选择实例点击创建 点击下一步后设置备份频率等 然后点击创建即可

Vue源码系列讲解——虚拟DOM篇【一】(Vue中的虚拟DOM)

目录 1. 前言 2. 虚拟DOM简介 2.1什么是虚拟DOM&#xff1f; 2.2为什么要有虚拟DOM&#xff1f; 3. Vue中的虚拟DOM 3.1 VNode类 3.2 VNode的类型 3.2.1 注释节点 3.2.2 文本节点 3.2.3 克隆节点 3.2.4 元素节点 3.2.5 组件节点 3.2.6 函数式组件节点 3.2.7 小结 3…

NCNN GPU初始化加速——cache实现

概要 NCNN的CPU初始化速度很快&#xff0c;但是当使用GPU进行推理时&#xff0c;初始化往往要花费几秒甚至更长时间。其他框架例如MNN有载入cache的方式来进行加速&#xff0c;NCNN目前没有相关接口来实现加速&#xff0c;那么NCNN是否也可以加载cache来实现加速呢&#xff1f;…

程序员的数字化工作台:理解不关机背后的逻辑与需求

目录 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a; 工作流程与需求&#xff1a; 数据安全与备份&#xff1a; 即时性与响应&#xff1a; 个人习惯等方面&#xff1a; 程序员为什么不喜欢关电脑&#xff1f; 电脑对程序员的重要性&#xff1a;…

龙测科技荣获2023年度技术生态构建奖

本月&#xff0c;由极客传媒举办的“有被Q到”2024 InfoQ 极客传媒合作伙伴年会顺利举办&#xff0c;龙测科技喜获2023年度技术生态构建奖。 InfoQ是首批将Node.js、HTML5、Docker等技术全面引入中国的技术媒体之一&#xff0c;秉承“扎根社区、服务社区、引领社区”的理念&…

Redis(十三)缓存双写一致性策略

文章目录 概述示例 缓存双写一致性缓存按照操作来分&#xff0c;细分2种读写缓存&#xff1a;同步直写策略读写缓存&#xff1a;异步缓写策略双检加锁策略 数据库和缓存一致性更新策略先更新数据库&#xff0c;再更新缓存先更新缓存&#xff0c;再更新数据库先删除缓存&#xf…

解决国内无法访问OpenAI API的三种方式

前言 在全球数字化的浪潮中&#xff0c;人工智能API成为了推动创新的关键工具。然而&#xff0c;由于网络限制&#xff0c;不是所有用户都能直接访问这些资源。国内就不能直接访问OpenAI官网&#xff0c;也就不能直接访问OpenAI API&#xff0c;这时候需要去寻找OpenAI的代理方…

DevExpress WinForms中文教程 - 如何创建可访问的WinForms应用?(二)

为用户创建易访问的Windows Forms应用程序不仅是最佳实践的体现&#xff0c;还是对包容性和以用户为中心的设计承诺。在应用程序开发生命周期的早期考虑与可访问性相关的需求可以节省长期运行的时间(因为它将决定设计决策和代码实现)。 一个可访问的WinForms应用程序提供了各种…

Python循环语句——for循环的基础语法

一、引言 在Python编程的世界中&#xff0c;for循环无疑是一个强大的工具。它为我们提供了一种简洁、高效的方式来重复执行某段代码&#xff0c;从而实现各种复杂的功能。无论你是初学者还是资深开发者&#xff0c;掌握for循环的用法都是必不可少的。在本文中&#xff0c;我们…

EasyRecovery2024永久免费版电脑数据恢复软件下载

EasyRecovery数据恢复软件是一款非常好用且功能全面的工具&#xff0c;它能帮助用户恢复各种丢失或误删除的数据。以下是关于EasyRecovery的详细功能介绍以及下载步骤&#xff1a; EasyRecovery-mac最新版本下载:https://wm.makeding.com/iclk/?zoneid50201 EasyRecovery-win…

2 月 7 日算法练习- 数据结构-树状数组

树状数组 lowbit 在学习树状数组之前&#xff0c;我们需要了解lowbit操作&#xff0c;这是一种位运算操作&#xff0c;用于计算出数字的二进制表达中的最低位的1以及后面所有的0。 写法很简单&#xff1a; int lowbit&#xff08;int x&#xff09;&#xff5b;return x &am…

基于SpringBoot+Vue的实验室管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

vHierarchy

与其他层次结构资产不同,vHierarchy是: -极简:没有噱头或视觉杂乱 - 可定制:任何功能都可以禁用 - 优化:无编辑器延迟 - 安全:没有隐藏的游戏对象,卸载后不会搞乱你的项目 特点: 组件迷你地图 - 见右侧列出的组件 - 按住Alt键并单击组件图标,打开组件编辑器弹出窗口 自…