Leetcode刷题-(1~5)-Java+Python+JavaScript

news2024/12/27 0:43:08

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

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

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

目录

1.两数之和

2.两数相加

3.无重复字符串的最长子串

4.寻找两个正序数组的中位数

5.最长回文子串


1.两数之和

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

思路:首先想到的是暴力双层循环,时间复杂度过高,可以使用哈希表,空间换时间,降低时间复杂度。利用hash表,时间复杂度O(n),存储当前值与下标,每次判断目标值-当前值是否存在,若存在,则找出。

java版:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>() ;
        for(int i=0; i<nums.length; i++){
            int element = target - nums[i] ;
            if(!map.containsKey(element)){
                map.put(nums[i], i) ;
            }else{
                return new int []{map.get(element), i} ;
            }
        }
        return new int []{} ;
    }
}

python版:
 

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        res = []
        d = {}
        index = 0
        for element in nums:
            if d.get(target - element) == None:
                d[element] = index 
            else:
                 res.append(d[target - element])
                 res.append(index)
                 return res 
            index += 1 
        return res 
        

JS版:
 

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    const obj = {}
    const ans = []
    for(let i=0; i<nums.length; i++){
        let element = target - nums[i]
        if(obj[element] === undefined){
            obj[nums[i]] = i 
        }else{
            ans.push(obj[element])
            ans.push(i)
            return ans 
        }
    }
    return ans 
};

2.两数相加

题目链接:https://leetcode.cn/problems/add-two-numbers/description/icon-default.png?t=N7T8https://leetcode.cn/problems/add-two-numbers/description/

思路:遍历链表,求和后,拼接即可,取余保留到当前,取整用于进位。

Java版:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode node = new ListNode(0) ;
        ListNode pre = node ;
        int carry = 0 ;
        while(l1 != null || l2 != null){
            int x = l1 == null ? 0 : l1.val ;
            int y = l2 == null ? 0 : l2.val ;
            
            int sum = x + y  + carry ;
            carry = sum / 10 ;
            sum = sum % 10 ;

            ListNode node1 = new ListNode(sum) ;
            if(l1 != null){
                l1 = l1.next ;
            }
            if(l2 != null){
                l2 = l2.next ;
            }
            node.next = node1 ;
            node = node.next ;

        }
        if(carry != 0){
            node.next = new ListNode(carry) ;
        }
        return pre.next ;
    }
}

Python版:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        node = ListNode(0)
        pre = node 
        carry = 0
        while (l1  or l2):
            x = y = 0
            if l1:
                x = l1.val
            if l2:
                y = l2.val 
            sum = x + y + carry
            # python与java不一样,这里需要用整除才行
            carry = sum // 10
            sum = sum % 10

            if l1 != None:
                l1 = l1.next
            if l2 != None:
                l2 = l2.next
            
            node.next = ListNode(sum)
            node = node.next
        if carry > 0:
            node.next = ListNode(carry)
            node = node.next
        return pre.next


            

JS版:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
     node = new ListNode(0)
     pre = node 
     let carry = 0 
     while(l1 != null || l2 != null){
         const x = l1 == null ? 0 : l1.val 
         const y = l2 == null ? 0 : l2.val 

         let sum = x + y + carry
         // js与python都是弱类型的,需要取整
         carry = Math.floor(sum / 10) 
         sum = sum % 10 
         
         if(l1 != null){
             l1 = l1.next 
         }
         if(l2 != null){
             l2 = l2.next
         }

         node.next = new ListNode(sum)
         node = node.next 
     }
     if(carry > 0){
         node.next = new ListNode(carry)
         node = node.next 
     }
     return pre.next
};

3.无重复字符串的最长子串

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

思路:可以用队列实现,队列满足先进先出的特性,如果队列中不含有当前元素,则元素入队,如果队列中含有当前元素,则出队直至不含有当前元素,整个过程中队列的最大长度即是答案。

Java版:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        LinkedList<Character> queue = new LinkedList<>() ;
        int max = 0 ;
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i) ;
            while(queue.contains(c)){
                queue.poll() ;
            }
            if(!queue.contains(c)){
                queue.add(c) ;
            }
           max = max < queue.size() ? queue.size() : max ;
        }
        return max ;
    }
}

Python版:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        max = 0
        i = 0
        list = []
        for s1 in s:
            while self.contains_str(s1, list):
                list.pop(0)
            if not self.contains_str(s1, list):
                list.append(s1)
            if max < len(list):
                max = len(list)
        return max 
    def contains_str(self, s1, list):
        for s2 in list:
            if s1 == s2:
                return True
        return False

Js版:
 

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let max = 0
    const arr = []
    for(let i=0; i<s.length; i++){
    
        while (arr.includes(s[i])){
            arr.shift()
        }
        if(!arr.includes(s[i])){
            arr.push(s[i])
        }
        max = max <  arr.length ? arr.length : max 

    }
    return max 
};

4.寻找两个正序数组的中位数

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

思路:题目要求时间复杂度是Olog(m+n),这样的话就不能合并数组后排序了,我们需要找出中位数,但是并不需要合并数组,那么我们要做的就是模拟走(数组1的长度+数组2的长度)/2步即可,每次让两个数组的中小的继续走,若其中一个走完了,则只能走另外一个。最后如果两个数组的长度之和是偶数,则除以2得到中位数,否则直接得到中位数。

Java版:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int start1 = 0, start2 = 0 ;
        int left = -1, right = -1 ;
        int m = nums1.length, n = nums2.length ;
        int len = m + n ;
        for(int i=0; i<=len/2; i++){
            left = right ;
            if(start1 < m && (start2 >= n || nums1[start1] <= nums2[start2])){
                right = nums1[start1 ++] ;
            }else{
                right = nums2[start2 ++] ;
            }
        }
        if(len%2 == 0){
            return (left + right) / 2.0  ;
        }else{
            return right ;
        }

    }
}

Python版:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        left = right = -1
        start1 = start2 = 0
        m = len(nums1)
        n = len(nums2)
        l = m + n

        for i in range(l // 2 + 1):
            left = right 
            # 这里需要注意防止列表下标越界
            if (start1 < m) and (start2 >= n or  nums1[start1] <= nums2[start2]):
                right = nums1[start1]
                start1 += 1
            else:
                right = nums2[start2]
                start2 += 1 
        
        if l%2 == 0:
            return (left + right) / 2
        else:
            return right

Js版:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    let left = -1, right = -1
    let start1 = 0, start2 = 0
    const m = nums1.length, n = nums2.length
    const len = m+n 
    for(let i=0; i<=Math.floor(len/2); i++){
        left = right 
        if(start1 < m && (start2 >=n || nums1[start1] <= nums2[start2])){
            right = nums1[start1++] ;
        }else{
            right = nums2[start2++] ;
        }
    }
    if(len % 2 == 0){
        return (left + right) / 2 ;
    }else{
        return right ;
    }
};

5.最长回文子串

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

思路:动态规划,递推式,外层循环很重要,要确保当前所用到的递推式之前推导出了结果。

dp[i][j] = dp[i+1][j-1] s[i] == s[j] && j-i>2

dp[i][j] = true s[i]==s[j] && j-i<=2

dp[i][j] = false   s[i] != s[j]

Java版:

class Solution {
    public String longestPalindrome(String s) {
       int n = s.length() ;
       boolean [][] dp = new boolean[n][n] ;
       int max = 0 ;
       String ans = "" ;
       // 动态规划递推式很重要,两层循环,当前所需的表达式要在之前递推出来了才行
       for(int j=0; j<n; j++){
           for(int i=0; i<=j; i++){
               if(s.charAt(i) != s.charAt(j)){
                   dp[i][j] = false ;
               }else{
                   if(j-i<=2){
                       dp[i][j] = true ;
                   }else{
                       dp[i][j] = dp[i+1][j-1] ;
                   }
               }
               if(dp[i][j] && max < j - i + 1){
                    max = j - i + 1 ;
                    ans = s.substring(i,j+1) ; 
               }
           }
       }
       return ans ;
    }
}

Python版:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        row = column = len(s)
        matrix = [[False for _ in range(column)] for _ in range(row)]
        max = 0 
        res = ""
        for j in range(column):
            for i in range(j+1):
                if s[i] == s[j]:
                    if j - i <= 2:
                        matrix[i][j] = True
                    else:
                        matrix[i][j] = matrix[i+1][j-1]
                if matrix[i][j] and j-i+1 >= max:
                    max = j - i + 1
                    res = s[i:j+1]
        return res 



Js版:

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let max = 0 
    let ans = ""
    const n = s.length 
    const arr = new Array(n)
    for(let i=0; i<n; i++){
        arr[i] = new Array(n).fill(false) ;
    }
    for(let j=0; j<n; j++){
        for(let i=0; i<=j; i++){
            if(s.charAt(i) == s.charAt(j)){
                if(j-i<=2){
                    arr[i][j] = true
                }else{
                    arr[i][j] = arr[i+1][j-1]
                }
            }
            if(arr[i][j] && max < j - i + 1){
                max = j - i + 1
                ans = s.substring(i,j+1)
            }
        }
    }
    return ans 
};

今天的算法题就到这里喽,我们下次继续,道阻且长,行则降至!

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

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

相关文章

【AI接口】语音版、文心一言大模型和AI绘图、图片检测API

文章目录 一、语音版大模型AI1、接口2、请求参数3、请求参数示例4、接口返回示例 二、AI图片鉴黄合规检测API1、接口2、请求参数3、请求参数示例4、接口返回示例5、报错说明6、代码开源 三、人工智能AI绘画API1、接口2、请求参数3、请求参数示例4、接口返回示例5、AI绘画成果展…

rabbitmq-java基础详解

一、rabbitmq是什么&#xff1f; 1、MQ定义 MQ&#xff08;Message Queue&#xff09;消息队列 主要解决&#xff1a;异步处理、应用解耦、流量削峰等问题&#xff0c;是分布式系统的重要组件&#xff0c;从而实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性的架…

LabVIEW精确测量产品中按键力和行程

项目背景 传统的按键测试方法涉及手工操作&#xff0c;导致不一致和效率低下。在汽车行业中&#xff0c;带有实体按键的控制面板非常常见&#xff0c;确保一致的按键质量至关重要。制造商经常在这些组件的大规模、准确测试中遇到困难。显然&#xff0c;需要一个更自动化、精确…

Unity3D和three.js的比较

一、Unity3D和three.js简介 Unity3D是一款跨平台的游戏引擎,可以用于开发2D和3D游戏。它提供了一个可视化的开发环境,包含了强大的编辑器和工具,使开发者可以方便地创建游戏场景、添加物体、设置物理效果、编写脚本等。Unity3D支持多种平台,包括PC、移动设备、主机等,可以…

uniapp uni.chooseLocation调用走失败那里,错误码:112

问题&#xff1a;我配置了百度上所有能配置的&#xff0c;一直调用不成功&#xff0c;如下图配置的 1:第一个 配置 代码&#xff1a; "permission": {"scope.userLocation": {"desc": "你的位置信息将用于小程序位置接口的效果展示"}…

华为设备NAT的配置

实现内网外网地址转换 静态转换 AR1&#xff1a; sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1&#xff1a; sys int g0/0/0 ip add…

【前沿技术杂谈:人工智能与种族主义 】谷歌在其视觉人工智能产生种族主义结果后道歉

【前沿技术杂谈&#xff1a;人工智能与种族主义 】谷歌在其视觉人工智能产生种族主义结果后道歉 背景调查现实世界的后果渐进式改变 一项自动标记图像的谷歌服务会根据给定图像的肤色产生截然不同的结果。该公司解决了这个问题&#xff0c;但问题可能更广泛。 为抗击新冠病毒&…

KubeSphere 开源社区 2023 年度回顾与致谢

2023 年结束了&#xff0c;让我们再一次一起回顾一下 KubeSphere 开源社区在过去一年的变化。更重要的是&#xff0c;本篇文章将会对 2023 年所有参与过 KubeSphere 社区贡献的成员致以最诚挚的感谢&#xff0c;快来看看有没有你&#xff01; 开源项目发展情况 2023 年&#…

C语言:数据在内存中的存储形式

一、整数在内存中的存储 关于整数在内存中的存储形式&#xff0c;在博主之前写的文章里已经介绍了&#xff01;友友们可以去点下面链接去看&#xff0c;这里就不过多介绍。 C语言&#xff1a;进制的转换以及原码、反码、补码 我们以整型在内存中的存储形式为基础&#xff0c…

k8s---ingress对外服务(ingress-controller)

ingress 概念 k8s的对外服务&#xff0c;ingress service作用现在两个方面&#xff1a; 1、集群内部&#xff1a;不断跟踪的变化&#xff0c;更新endpoint中的pod对象&#xff0c;基于pod的ip地址不断变化的一种服务发现机制。 2、集群外部&#xff1a;类似于负载均衡器&a…

群晖nas内网穿透

目录 一、前言 二、操作步骤 &#xff08;一&#xff09;查看群晖是否有ipv6地址 &#xff08;二&#xff09;下载安装docker &#xff08;三&#xff09;docker里面安装ddns-go &#xff08;四&#xff09;阿里云官网购买域名 &#xff08;五&#xff09;域名解析 阿里…

如何实现无公网ip远程访问内网本地BUG管理服务【内网穿透】

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

python数字图像处理基础(五)——Canny边缘检测、图像金字塔、图像分割

目录 Canny边缘检测原理步骤 图像金字塔1.高斯金字塔2.拉普拉斯金字塔 图像分割图像轮廓检测1.检测轮廓2.绘制轮廓3.补充 Canny边缘检测 梯度是什么? 梯度就是变化的最快的那个方向 edge cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]…

MySql三方工具

Yearning 1.1.1 Yearning简介 Yearning 开源的MySQL SQL语句审核平台&#xff0c;提供数据库字典查询&#xff0c;查询审计&#xff0c;SQL审核等多种功能。 Yearning 1.x 版本需Inception提供SQL审核及回滚功能。 Inception是集审核&#xff0c;执行&#xff0c;回滚于一体的…

RK3568 android11 移植 v4l2loopback 虚拟摄像头

一&#xff0c;v4l2loopback 简介 v4l2loopback是一个Linux内核模块&#xff0c;它允许用户创建虚拟视频设备。这种虚拟视频设备可以用于各种用途&#xff0c;例如将实际摄像头的视频流复制到虚拟设备上&#xff0c;或者用于视频流的处理和分析等。v4l2loopback的主要作用是创…

《WebKit 技术内幕》之三(3): WebKit 架构和模块

3 Webkit2 3.1 Webkit2 架构及模块 相比于狭义的WebKit&#xff0c;WebKit2是一套全新的结构和接口&#xff0c;而并不是一个简单的升级版。Webkit2 的思想同 Chrominum 类似&#xff0c;就是将渲染过程放在单独的进程中来完成&#xff0c;独立于用户界面。 webKit2中…

设计模式-简单工厂

设计模式-简单工厂 简单工厂模式是一个集中管理对象创建&#xff0c;并根据条件生成所需类型对象的设计模式&#xff0c;有助于提高代码的复用性和维护性&#xff0c;但可能会导致工厂类过于复杂且违反开闭原则。 抽象提取理论&#xff1a; 封装对象创建过程解耦客户端与产品…

FPGA按钮消抖实验

1、概述 按键的消抖&#xff0c;是指按键在闭合或松开的瞬间伴随着一连串的抖动&#xff0c;这样的抖动将直接影响设计系统的稳定性&#xff0c;降低响应灵敏度。因此&#xff0c;必须对抖动进行处理&#xff0c;即消除抖动的影响。实际工程中&#xff0c;有很多消抖方…

STM32开发板,Win10、Win11 上的驱动安装说明

一、USB线插到 CMSIS-DAP 接口上&#xff0c;将自动识别到两个设备 ① CMSIS-DAP&#xff1a;用于烧录代码、在线硬件仿真; 在Keil里烧录&#xff0c;无需通过FlyMCU; ② USB转TTL&#xff1a;用于开发板与电脑间串口通信 &#xff0c;即USART1, TX-PA9、RX-PA10; 接口备注&a…

百度地图实现搜索并在地图上标注,手动点击标注获取经纬度

在代码只需要替换为你自己的key即可。 如何申请key:如何申请百度地图ak?|2023年5月更新版 - 知乎 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>百度地图搜索</title><!-- 引入百度地…