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

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

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

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

目录

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.mfbz.cn/a/376359.html

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

相关文章

更新至2022年,2008-2022年按行业分城镇单位就业人员相关指标数据(20个指标)

更新至2022年&#xff0c;2008-2022年按行业分城镇单位就业人员相关指标数据 1、时间&#xff1a;2008-2022年 2、来源&#xff1a;统计年鉴、国家统计J、各省年鉴 3、指标&#xff1a;2008-2022年城镇单位就业人员(万人)、2008-2022年农林牧渔业城镇单位就业人员(万人)、制…

idea中git提交代码出现:commit and push checks failed

参考&#xff1a;https://blog.csdn.net/qq_46548855/article/details/126506747

ThinkPHP 中使用Redis

环境.env [app] app_debug "1" app_trace ""[database] database "" hostname "127.0.0.1" hostport "" password "" prefix "ls_" username ""[redis] hostname "127.0.0.1…

浅谈交换原理(3)——交换网络

一、基本概念 交换网络是由若干个交换单元按照一定的拓扑结构和控制方式构成的网络。交换网络的三个基本要素是&#xff1a;交换单元、不同交换单元间的拓扑连接和控制方式。 1.1 单机交换网络与多级交换网络 交换网络按拓扑连接方式可分为&#xff1a;单级交换网络和多级交换网…

第三篇:跨平台QT开发-正则表达式和文件处理

正则表达式 正则表达式即一个文本匹配字符串的一种模式&#xff0c;Qt 中 QRegExp 类实现使用正则表达式 进行模式匹配&#xff0c;且完全支持 Unicode&#xff0c;主要应用&#xff1a;字符串验证、搜索、查找替换、分割。 正则表达式中字符及字符集 元素含义 c 匹配字符本…

mac电脑快捷指令实现拼图

mac访达&#xff0c;搜索输入‘快捷指令’&#xff0c;找到‘快捷指令’&#xff0c; 点击快捷指令&#xff0c;进入快捷指令中心&#xff0c;搜索‘拼图’ &#xff0c;选中‘照片拼图’&#xff0c; 点击‘添加快捷指令’&#xff0c; 在‘所有快捷键指令’中可以看到添加的快…

C++ || 模板初阶 | 函数模板 | 类模板

泛型编程 泛型编程&#xff0c;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 可以理解为活字印刷术类似的方式。 函数模板 函数模板概念 函数模板&#xff0c;代表一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用…

Python调用matlab程序

matlab官网&#xff1a;https://ww2.mathworks.cn/?s_tidgn_logo matlab外部语言和库接口&#xff0c;包括 Python、Java、C、C、.NET 和 Web 服务。 matlab和python的版本 安装依赖配置 安装matlab的engine 找到matlab的安装目录&#xff1a;“xxx\ extern\engines\python…

Linux的进程信号

注意&#xff1a;首先需要提醒一个事情&#xff0c;本节提及的进程信号和下节的信号量没有任何关系&#xff0c;请您区分对待。 1.信号概念 1.1.生活中的信号 我们在生活中通过体验现实&#xff0c;记忆了一些信号和对应的处理动作&#xff0c;这意味着信号有以下相关的特点&…

重生奇迹mu仙踪林npc

工匠尤达 NPC工匠尤达位于仙踪林的坐标为(87, 134)&#xff0c;他可以给玩家制作装备和强化装备。 精灵安吉拉 NPC精灵安吉拉位于仙踪林的坐标为(29, 196)&#xff0c;她可以给玩家提供补血、补魔服务&#xff0c;同时也能提供提高属性点数的服务。 仓库使者塞维特 NPC仓库…

SpringCloud-创建多模块项目

在微服务架构中&#xff0c;项目的组织结构对于代码的维护和团队的协作至关重要。Spring Cloud作为一个强大的微服务框架&#xff0c;提供了丰富的功能和组件&#xff0c;同时也支持多模块项目的创建&#xff0c;使得代码结构更加清晰、易于管理。本文将介绍如何使用 Spring Cl…

NModbus的NuGet包使用样例

首先仿真软件ModbusSlave简单配置3条数据&#xff1a; 连接配置&#xff1a; VS中安装NuGet包&#xff1a;NModbus4 简单获取湿度 SerialPort serialPort new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();Modbus.Device.ModbusSer…

端口扫描神器:御剑 保姆级教程(附链接)

一、介绍 御剑&#xff08;YooScan&#xff09;是一款网络安全工具&#xff0c;主要用于进行端口扫描。它具有直观的用户界面&#xff0c;方便用户进行端口扫描和信息收集。以下是御剑端口扫描工具的一些主要特点和功能&#xff1a; 图形用户界面&#xff1a; 御剑提供直观的图…

第 123 场 LeetCode 双周赛题解

A 三角形类型 II 三条边能构成三角形的充要条件是任意一边都小于其余两边之和&#xff0c;枚举各边判断能否构成三角形&#xff0c;若能再判断是否存在边想等 class Solution { public:string triangleType(vector<int> &nums) {int s accumulate(nums.begin(), num…

工厂方法模式(Factory Method Pattern)

原文地址:https://jaune162.blog/design-pattern/factory-method-pattern/ 概述 工厂方法模式(Factory Method Pattern)是一个对象创建型模式。 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。 – 《设计模式:可复…

灵活应对:策略模式在软件设计中的应用

策略模式是一种行为型设计模式&#xff0c;它允许定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端&#xff0c;使得在不修改原有代码的情况下切换或扩展新的算法成为可能。 使用策略模式的场景包…

《合成孔径雷达成像算法与实现》Figure6.9

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

java 基础 (1)简介-程序基础-流程控制-数组操作

学习教程 java入门 JavaEE JavaSe JavaMe 简单来说&#xff0c;Java SE就是标准版&#xff0c;包含标准的JVM和标准库&#xff0c;而Java EE是企业版&#xff0c;它只是在Java SE的基础上加上了大量的API和库&#xff0c;以便方便开发Web应用、数据库、消息服务等&#xff0c;…

运维必会篇-主从复制

主从复制 概述 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这 些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制&#xf…

进程间通信(3):共享内存

多个进程共享同一片内存空间&#xff0c;不需要进行数据的拷贝&#xff0c;效率最高&#xff1b;但存在资源竞争问题。 函数&#xff1a;shmget(搭配ftok)、shmat、shmdt、shmctl 实现流程&#xff1a; 1、创建共享内存IPC对象 shmget(ftok) 2、内存映射 shmat 3、通信 sca…
最新文章