力扣HOT100 (1-5)

news2024/12/23 16:10:01

目录

1.两数之和

2.两数相加

拓展到牛客的TOP101的BM11( 链表相加(二))

3.无重复的最长子串(牛客BM92)

 解法1:

解法2:

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

 5.最长回文子串


1.两数之和

思路:HashMap的containKey,key是具体数值,value是对应下标。如果包含了目标数字-当前数字的值,则返回key对应的value以及当前下标,否则将其加入到HashMap中,

代码: 

public int[] twoSum(int[] nums, int target) {        
        //创建hashmap
        HashMap<Integer,Integer> hashMap = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            //是否包含
            if (hashMap.containsKey(target-nums[i])){
                return new int[] {hashMap.get(target-nums[i]),i};
            }
            //将其加入到HashMap中
            hashMap.put(nums[i], i);
        }

        return new int[0];

}

2.两数相加

 思路:链表第一个节点是个位,然后依次向后是百位,千位.....。因此,直接用链表从一个节点进行相加,获得新的值,存入新的链表中(尾插法),最终输出。

代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //新链表,有虚拟头节点
        ListNode newHead = new ListNode(-1);
 
        ListNode cur = newHead;
        //进位
        int temp = 0;
 
        while (l1!=null || l2!=null){
 
            int val = temp;
            if (l1!=null){
                val+=l1.val;
                l1=l1.next;
            }
 
            if (l2!=null){
                val+=l2.val;
                l2=l2.next;
            }
 
            temp = val/10;
 
            ListNode node = new ListNode(val%10);
            //尾插法建立链表
            cur.next=node;
            cur = cur.next;
 
        }
 
        //判断最后一位
        if (temp > 0){
            ListNode node = new ListNode(temp);
            cur.next= node;
        }
        //输出跳过虚拟头节点
        return newHead.next;
    }

拓展到牛客的TOP101的BM11( 链表相加(二))

思路:可知,链表最后一个节点是个位,然后依次向前是百位,千位.....,我们相加都是先从个位加起,然后百位.....(中间要考虑进位),因此,采用栈的方式,利用栈的先进后出,获取链表尾部(个位),然后依次出栈相加,获得新的值,存入新的链表中(头插法),最终输出。

 代码:

import java.util.*;
//链表类 
public class ListNode {
   int val;
   ListNode next = null;
 }
 
public class Solution {
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        //特殊情况
        if (head1 == null){
            return head2;
 
        }
        if (head2 == null){
            return head1;
        }
        //两个辅助栈
        Stack<ListNode> s1 = new Stack<>();
        Stack<ListNode> s2 = new Stack<>();
 
        ListNode h1 = head1;
        ListNode h2 = head2;
        //两个链表依次入栈
        while (h1!= null){
            s1.push(h1);
            h1 = h1.next;
        }
        while (h2 != null){
            s2.push(h2);
            h2 = h2.next;
        }
        //进位
        int temp = 0;
 
        //创建新链表,
        ListNode newHead = null;
        //当s1或s2不为空的时候
        while (!s1.isEmpty() || !s2.isEmpty()){
            int val = temp;
            if (!s1.isEmpty()){
                val += s1.pop().val;
            }
            if (!s2.isEmpty()){
                val+=s2.pop().val;
            }
 
            //判断进位
            temp = val/10;
            //头插法,val%10是,如果存在进位的话,应该只取个位,比如说
            //s1的值是7,s2的值是8,两者相加后,得15,因此,进位是1,而新节点的值是5
            ListNode node = new ListNode(val%10);
            node.next = newHead;
            newHead = node;
 
 
        }
 
        //判断第一位
        if (temp > 0){
            ListNode node = new ListNode(temp);
            node.next = newHead;
            newHead = node;
        }
 
        return newHead;
    }
}

3.无重复的最长子串(牛客BM92)

 解法1:

思路:我们使用两个指针,一个i一个j,最开始的时候i和j指向第一个元素,然后i往后移,把扫描过的元素都放到HashMap中,如果i扫描过的元素没有重复的就一直往后移,顺便记录一下最大值max,如果i扫描过的元素有重复的,就改变j的位置。我们就以p w w k e w,(图源自牛客大佬)

代码:

public int lengthOfLongestSubstring(String s) {
// write code here
        if (s==null)
            return 0;

        int length = s.length();
        int max = 0;

        //hashmap
        HashMap<Character,Integer> hp = new HashMap<>();

        for (int i = 0,j = 0; i < length; i++) {
            if (hp.containsKey(s.charAt(i))){
                j = Math.max(j,hp.get(s.charAt(i))+1);
            }
            hp.put(s.charAt(i),i);
            max = Math.max(max,i-j+1);
        }

        return max;
    }

解法2:

用一个队列(Queue),把元素不停的加入到队列中,如果有相同的元素,就把队首的元素移除,这样我们就可以保证队列中永远都没有重复的元素,记录队列的最大长度。

代码:

public int lengthOfLongestSubstring(String s) {
// write code here
        if (s==null)
            return 0;

        int length = s.length();
        int max = 0;

        //创建队列
        Queue<Character> queue = new LinkedList<>();
        for (int i = 0; i < length; i++) {
            while (queue.contains(s.charAt(i)))
                //移除队首元素
                queue.poll();
            queue.add(s.charAt(i));
            max = Math.max(max,queue.size());
        }

        return max;
    }

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

思路:由于是困难题,故先放弃最优解法,先给出一个笨方法,即将两个数组合并,然后输出合并数组的中位数。(后续如果有多余的时间刷困难题,会进行完善)

代码:

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        //第一种方法:先将两个数组合并,然后排序,找到中位数。

        //创建arraylist,存储数组数据
        ArrayList<Integer> list = new ArrayList<>();
        //添加第一个数组
        for (int i = 0; i < nums1.length; i++) {
            list.add(nums1[i]);
        }
        //添加第二个数组
        for (int i = 0; i < nums2.length; i++) {
            list.add(nums2[i]);
        }
        //排序
        Collections.sort(list);
        //转化为数组
        Integer[] num = list.toArray(new Integer[(list.size())]);

        //寻找中位数
        if (num.length %2 == 0){
            return (num[num.length/2]+num[num.length/2-1])/2.0;
        }else {
            return num[num.length/2];
        }
    }

 5.最长回文子串

 思路:动态规划(参考官方)

动态规划的步骤:

 代码:

public static String longestPalindrome(String s) {
        int len = s.length();
        //如果字符串长度小于2,直接返回
        if (len < 2)
            return s;

        int max = 1;
        //起始位置
        int begin = 0;
        // dp[i][j] 表示 s[i..j] 是否是回文串
        boolean[][] dp = new boolean[len][len];
        //所有长度为1的子串一定是回文串
        for (int i = 0; i < len; i++) {
            dp[i][i] = true;
        }

        //将字符串转化为char数组
        char[] chars = s.toCharArray();

        //开始递推
        //L为子串的长度,从2开始枚举,因为子串长为1的已经为true
        for (int L = 2; L <= len; L++) {
            //枚举左边界
            for (int i = 0; i < len; i++) {
                //右边界j = L+i-1;
                int j = L+i-1;

                //右边界越界则退出当前循环
                if (j >= len)
                    break;

                //判断字符是否相等
                if (chars[i]!=chars[j]){
                    dp[i][j] = false;
                }else {
                    //如果子串长度<=2,即j-i<1
                    if (j-i<=1)
                        dp[i][j]=true;
                    else
                        dp[i][j]=dp[i+1][j-1];
                }

                //只要 dp[i][L] == true 成立,就表示子串 s[i..L] 是回文,此时记录回文长度和起始位置
                if (dp[i][j] && j-i+1 > max){
                    max = j-i+1;
                    begin = i;
                }

            }
        }

        return s.substring(begin,begin+max);
    }

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

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

相关文章

Centos7下安装单节点flink1.13

前置环境配置jdk可以参考博文&#xff1a;Centos7下安装hadoop单节点 。 如下图所示&#xff0c;这里我们将flink-1.13.0-bin-scala_2.12.tgz上传到如下路径&#xff1a; 解压安装文件到/opt/module下面 tar -zxvf flink-1.13.0-bin-scala_2.12.tgz -C /opt/module/将flink…

背包问题求方案数、具体方案

背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…

如何实现LFU缓存(最近最少频率使用)

目录 1.什么是LFU缓存&#xff1f; 2.LFU的使用场景有哪些&#xff1f; 3.LFU缓存的实现方式有哪些&#xff1f; 4.put/get 函数实现具体功能 1.什么是LFU缓存&#xff1f; LFU缓存是一个具有指定大小的缓存&#xff0c;随着添加元素的增加&#xff0c;达到容量的上限&…

为什么我们不再发明编程语言了?

上个世纪&#xff0c;数百种编程语言被发明出来&#xff0c;但是进入21世纪&#xff0c;当我们都进入互联网时代时&#xff0c;只剩那么寥寥几个了。 如果你翻一下TIOBE得编程语言排行榜&#xff0c;就会发现20年来&#xff0c;上蹿下跳的就是那几张老面孔&#xff1a;C , Java…

(片花)原汤话原食:从公共场所不知深浅的熊孩子聊聊边界感这事

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 伊姐 编辑 / SandLiu 卷圈 监制 / 姝琦 文案 / 伊姐 产品统筹 / bobo 录音间 / 声湃轩天津站本期节目完整版请在各大音频平台搜索”原汤话原食“&#xff0c;找到原汤话原食栏目后订阅收听。刚刚过去的春节&#xff0c;许…

靓号管理(2)

表结构&#xff1a; 根据表结构的需求&#xff0c;在models.py中创建类。 主要是创建级别和默认级别 class PrettyNum(models):"""靓号表"""models models.CharField(verbose_name"手机号", max_length32)price models.IntegerFie…

MES系统智能工厂,搭上中国制造2025顺风车

MES在电子制造业中的应用日益广泛&#xff0c;越来越多的厂商已经购置或自行开发了MES&#xff0c;并将其作为“智能化工厂”。国内大大小小、各行各业都有上百个MES系统&#xff0c;还有很多的国外MES系统&#xff0c;怎么才能在MES系统公司中找到适合自己的MES&#xff1f;希…

数据库学习笔记(2)——workbench和SQL语言

1、workbench简介&#xff1a; 登录客户端的两种方法 在cmd中&#xff0c;只能通过sql语句控制数据库&#xff1b;workbench其实就是一种图形化数据库管理工具&#xff0c;在workbench中既可以通过sql语句控制数据库&#xff0c;也可以通过图形化界面控制数据库。通过workbenc…

LeetCode题解 动态规划(四):416 分割等和子集;1049 最后一块石头的重量 II

背包问题 下图将背包问题做了分类 其中之重点&#xff0c;是01背包&#xff0c;即一堆物件选哪样不选哪样放入背包里。难度在于&#xff0c;以前的状态转移&#xff0c;多只用考虑一个变量&#xff0c;比如爬楼梯的阶层&#xff0c;路径点的选择&#xff0c;这也是能用滚动数组…

ChatGPT 的未来挑战和风险

ChatGPT 是 OpenAI 开发的流行语言模型&#xff0c;彻底改变了我们与 AI 交互的方式。然而&#xff0c;随着像 ChatGPT 这样的语言模型的使用越来越广泛&#xff0c;重要的是要考虑它们未来可能面临的潜在风险和挑战。 一、数据质量和公平性 使用 ChatGPT 的主要风险之一是用于…

大数据-------元数据管理

一、什么是元数据 元数据就是描述数据的数据&#xff0c;它为企业的各类数据提供了上下文环境&#xff0c;使企业能够更好地了解、管理和使用数据。 现在数据对于公司的决策十分的重要&#xff0c;随着业务的发展&#xff0c;业务线会慢慢庞大起来&#xff0c;随着开发人员的…

九、STM32定时器讲解 - 通用定时器实战

目录 1.三种定时器的区别 2.通用定时器的特点描述 3.计数器模式 4.通用定时器工作过程 5.计数器时钟计算方法、 5.1定时器的输入时钟频率 - TimeClockFren 5.2计数器时钟计算方法 6.定时器相关寄存器 7.定时器库函数结构体 8.通用定时器函数 9.定时器中断配置过程 1…

图论算法:树上倍增法解决LCA问题

文章目录树上倍增法&#xff1a; LCA问题树上倍增法&#xff1a; LCA问题 树上倍增法用于求解LCA问题是一种非常有效的方法。 倍增是什么&#xff1f; 简单来说&#xff0c;倍增就是 1 2 4 8 16 … 2^k 可以发现倍增是呈 2的指数型递增的一类数据&#xff0c;和二分一样&…

黑马程序员 Linux 教程

目录Linux 简介不同应用领域主流操作系统Linux 系统历史Linux 系统版本Linux 安装安装方式网卡设置安装 SSH 连接工具使用 FinalShell 连接到 LinuxLinux 和 Windows 目录结构对比Linux 目录介绍Linux 常用命令Linux 命令初体验Linux 命令使用技巧Linux 命令格式文件目录操作命…

Python的文件编码,复制,缓冲,删除

能力有限&#xff0c;仅供参考 本篇博文是上一篇博文&#xff08; Python的文件读取&#xff0c;写入&#xff09;的后续&#xff0c;也是python文件管理的一部分&#xff0c;废话不多说&#xff0c;现在就开始。 1. 编码 在实际工作学习中&#xff0c;你可以遇到乱码的问题…

c语言递归 累和 ,累乘积,斐波那契数列,字符串长度

目录 递归使用场景 1:使用递归的方式计算 Sn123..100 2&#xff1a;计算 n&#xff01;n*(n-1)*(n-2)*......*1; 3:计算输出斐波那契数列前20项&#xff0c;并按每行4个数的格式输出(2019年&#xff09; 4&#xff1a; 用递归和非递归两种方式编写函数strlength()。该函数…

Nacos 入门微服务项目实战

Nacos 核心源码精讲 - IT贱男 - 掘金小册全方位源码精讲&#xff0c;深度剖析 Nacos 注册中心和配置中心的核心思想。「Nacos 核心源码精讲」由IT贱男撰写&#xff0c;375人购买https://s.juejin.cn/ds/BuC3Vs9/ Hi&#xff0c;大家好&#xff0c;欢迎大家来学习《Nacos 核心源…

2022黑马Redis跟学笔记.基础篇(一)

2022黑马Redis跟学笔记.基础篇 一1.Redis入门1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结1.2.认识Redis1.3.安装Redis步骤一&#xff1a;安装Redis依赖步骤二&#xff1a;上传安装包并解压步骤三&#xff1a;启动(1).默认启动(2…

开发微服务电商项目演示(三)

一&#xff0c;nginx动静分离第1步&#xff1a;通过SwitchHosts新增二级域名&#xff1a;images.zmall.com第2步&#xff1a;将本次项目的易买网所有静态资源js/css/images复制到nginx中的html目录下第3步&#xff1a;在nginx的核心配置文件nginx.conf中新增二级域名images.zma…

论文阅读:MINE: Towards Continuous Depth MPI with NeRF for Novel View Synthes

中文标题&#xff1a;基于连续深度多平面和神经辐射场的新视角合成 本文只介绍与NeRF原文不同的部分 创新点 对单一图像进行密集三维重建&#xff0c;完成新视角合成与深度估计的工作。从单个图像生成连续和遮挡绘制的三维重建。MINE借鉴NeRF可以生成连续的深度图像。 解决…