Java — LeetCode 面试经典150题(一)

news2024/9/24 15:54:42

双指针

125.验证回文串

题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

提示:

1 <= s.length <= 2e5
s 仅由可打印的 ASCII 字符组成

示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。由于空字符串正着反着读都一样,所以是回文串。
解析:

该题是个水题,只需要移除所有非字母数字字符之后,利用双指针从新的字符串的头部和尾部不断地向对方推进,进行比较。
当两个不相同的字符时,就结束,说明此串不是回文串。

代码:
class Solution {
    public boolean isPalindrome(String s) {
        String p=s.toLowerCase();
        System.out.print(p);
        char[] a=new char[p.length()];
        int len=0;
        for (int i=0;i<p.length();i++){
            if (p.charAt(i)>='a'&&p.charAt(i)<='z'||p.charAt(i)>='0'&&p.charAt(i)<='9'){
                a[len++]=p.charAt(i);
            }
        }
        boolean flag=true;
        for (int i=0,j=len-1;i<=j;i++,j--){
            if (a[i]!=a[j]){
                flag=false;
                break;
            }
        }
        return flag;
    }
}

392.判断子序列

题目

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

提示:

0 <= s.length <= 100
0 <= t.length <= 1e4
两个字符串都只由小写字符组成。

示例 1:
输入:s = "abc", t = "ahbgdc"
输出:true
示例 2:
输入:s = "axc", t = "ahbgdc"
输出:false
解析:

遍历字符串 t,用一个指针 l 指向字符串 s 的最后一个与 s 匹配的字符的位置。
当 t[i]==s[l] 时,l++。直到遍历结束,比较 l 与字符串 s 的长度即可。

代码:
class Solution {
    public boolean isSubsequence(String s, String t) {
        int n = t.length(), m = s.length();
        if (m == 0)
            return true;
        int l = 0;
        for (int i = 0; i < n; i++) {
            if (t.charAt(i) == s.charAt(l)) {
                l++;
            }
            if (l == m) {
                break;
            }
        }
        if (l == m)
            return true;
        return false;
    }
}

167.两数之和 II - 输入有序数组

题目

给你一个下标从 1 开始的整数数组 numbers ,该数组已按非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。
如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。

提示:

2 <= numbers.length <= 3 * 1e4
-1000 <= numbers[i] <= 1000 , numbers 按 非递减顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案

示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
解析:

该数组已经按照非递减顺序排列,设置两个指针,分别指向数组头部和尾部。
如果指向的两个数的和大于目标数,就需要将小的那个数变大,即头部指针向后移动;反之,尾部指针向前移动。
直到两个数的和等于目标数。(仅存一个有效答案哦!)

代码
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int n=numbers.length;
        int l=0,r=n-1;
        int[] ans=new int[2];
        while (l<r){
            if (numbers[l]+numbers[r]==target){
                ans[0]=l+1;
                ans[1]=r+1;
                break;
            }
            else if (numbers[l]+numbers[r]<target){
                l++;
            }
            else{
                r--;
            }
        }
        return ans;
    }
}

11.盛最多水的容器

题目

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

提示:

n == height.length
2 <= n <= 1e5
0 <= height[i] <= 1e4

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
解析:

首先知道怎么计算水量,水量等于两个端点的距离 * 两条线较短的一条的长度。
设置两个指针指向数组的头部和尾部,一个最开始的水量就是尾部减头部的距离 * 较小的长度。
什么情况才可能比这个状态的水量大呢?就是取决于两点的距离和较短的一条线长度。
将短的那条线的指针向里面推进,只有当较短的变长了,才有可能水量变大。
这样不断推进两边端点,不断增加线的长度。每次找到后,取水量的最大值即可。

代码:
class Solution {
    public int maxArea(int[] height) {
        int ans = 0;
        int l = 0, r = height.length - 1;
        while (l < r) {
            if (height[l] < height[r]) {
                ans = Math.max(ans, height[l] * (r - l));
                int t = height[l];
                while (l <= r && height[l] <= t)
                    l++;
            } else {
                ans = Math.max(ans, height[r] * (r - l));
                int t = height[r];
                while (l <= r && height[r] <= t)
                    r--;
            }
        }
        return ans;
    }
}
 

15.三数之和

题目

给你一个整数数组 nums ,判断是否存在三元组[nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。
请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

提示:

3 <= nums.length <= 3000
-1e5 <= nums[i] <= 1e5

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
解析:

首先,数据最大是3000,所以双for循环不会超时,所以用双for循环遍历nums[i]和nums[j],那么关于剩下的数就是判断0-nums[i]-nums[j]是否在数组中了,我是用的map,将数组中的数和它的坐标存在map对象中,判断该数是否存在且不是第i个数也不是第j个数。
然后就是去重问题,我将符合条件的三个数,存放进一个数组中,进行sort。然后将数组的三个数放进List中,将List放进一个Set中,进行去重。(有更简便的算法,我这个是更加合理地使用集合的那些容器)

代码:
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Set<List<Integer>> res = new HashSet<>();
        Map<Integer, Integer> m = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            m.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++)
            for (int j = i + 1; j < nums.length; j++) {
                int k = 0 - nums[i] - nums[j];
                if (m.containsKey(k) && m.get(k) != i && m.get(k) != j) {
                    List<Integer> s = new ArrayList<>();
                    int[] a = new int[3];
                    a[0] = nums[i];
                    a[1] = nums[j];
                    a[2] = k;
                    Arrays.sort(a);
                    s.add(a[0]);
                    s.add(a[1]);
                    s.add(a[2]);
                    res.add(s);
                }
            }
        return new ArrayList<List<Integer>>(res);
    }
}

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

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

相关文章

代码随想录算法day39 | 动态规划算法part12 | 115.不同的子序列,583. 两个字符串的删除操作,72. 编辑距离

115.不同的子序列 相对于 392.判断子序列&#xff0c;本题有难度了&#xff0c;感受一下本题和 392.判断子序列 的区别。 力扣题目链接(opens new window) 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff…

企业如何选择合适的可观测产品

数字化进程的推进&#xff0c;使得不同企业对于数字化可观测产品提出了各种差异化的需求。本文先是具体分析了不同类型的企业对于可观测产品的直接需求和痛点&#xff0c;描述了可观测产品的所能提供的更丰富的实际应用场景。紧接着从开源产品&#xff0c;国外商业产品&#xf…

E33.【C语言】数据在内存中的存储练习集(未完)

1. 求下列代码的打印结果 #include <stdio.h> int main() {char a -1;signed char b -1;unsigned char c -1;printf("a%d,b%d,c%d", a, b, c);return 0; } 答案速查 分析 之前讲过,char在VS中默认为signed char,则a和b的打印结果应该是一样的 存储范围…

专属文生图助手——SD3+ComfyUI文生图部署步骤

SD3ComfyUI文生图部署步骤 我们使用DAMODEL来实现文生图的部署。 根据提供的操作步骤与代码段落&#xff0c;本文旨在介绍如何下载并部署 Stable Diffusion 3 模型&#xff0c;并通过 ComfyUI 架构实现基于 Web 界面的图像生成应用。本文将剖析各个步骤&#xff0c;并详细解释…

无人机之编程基础原理

无人机编程基础原理涉及多个方面&#xff0c;主要包括无人机的基本原理、飞行控制算法、编程语言及算法应用等。以下是对这些方面的详细阐述&#xff1a; 一、无人机基本原理 无人机的基本原理是理解其结构、飞行原理、传感器和控制系统等的基础。无人机通常由机身、动力系统&…

Linux网络之UDP与TCP协议详解

文章目录 UDP协议UDP协议数据报报头 TCP协议确认应答缓冲区 超时重传三次握手其他问题 四次挥手滑动窗口流量控制拥塞控制 UDP协议 前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理 毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情 我们首先知道计算机网…

基于51单片机的自动清洗系统(自动洗衣机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C52单片机&#xff0c;采用DS18B20温度传感器检测温度&#xff0c;通过LCD1602显示屏显示&#xff0c;并且按键 可以加减温度的上限&#xff1b; 点击清洗按键后&#xff0c;倒计时1分钟&…

61.【C语言】数据在内存中的存储

1.前置知识 整数在内存中以补码形式存储 有符号整数三种码均有符号位,数值位 正整数:原码反码补码 负整数:原码≠反码≠补码 2.解释 int arr[] {1,2,3,4,5}; VSx86Debug环境下,内存窗口输入&arr VSx64Debug环境下,内存窗口输入&arr 存放的顺序都一样,均是小端序…

探索组合模式:构建灵活的层次结构

组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户可以以一致的方式处理单个对象和组合对象。 一&#xff0c;组合模式的结构 组合模式主要包含以下几个部分&#xff1a; 组件&#xff08;Component&a…

Java练习-----时间工具类(JDK8之后)

目录 LocalDate/LocalTime/LocalDateTime类 ZoneDateTime和ZoneId Instant类 DateTimeFormatter类 &#xff1a;解析格式化时间 LocalDate/LocalTime/LocalDateTime类 package crrc.studytest1;import java.time.Duration; import java.time.LocalDateTime;public class Du…

虚拟机屏幕分辨率自适应VMWare窗口大小

文章目录 环境问题解决办法其它虚拟机和主机间复制粘贴 参考 环境 Windows 11 家庭中文版VMWare Workstation 17 ProUbuntu 24.04.1 问题 虚拟机的屏幕大小&#xff0c;是固定的。如下图&#xff0c;设置的分辨率是800*600&#xff0c;效果如下&#xff1a; 可见&#xff0c…

统信服务器操作系统ade版【iostat】命令详解

统信服务器操作系统全版本iostat 安装、命令格式和命令参数 文章目录 功能概述功能介绍1.iostat安装2.iostat命令格式3.iostat命令参数 功能概述 iostat主要用与报告CPU统计信息和设备分区的io统计信息&#xff0c;iostat首次运行时显示自系统启动开始的各项统计信息&#xff…

1.5 计算机网络的分层结构

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 分层设计2 网络体系结构2.1 基本概述2.2 常见的三种网络体系结构 3 各层之间的关系3.1 水平关系3.2 垂直关系 4 数据传输过程4.1 水平视角4.2 垂直视角 前言 在当今数字…

Ubuntu22.04安装GNSS数据处理软件GAMIT/GLOBK

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 手把手带您安装gamit/globk软件~ &#x1f33f;前言 受朋友之托&#xff0c;出一期Ubuntu22.04安装GNSS数据处理软件——gamit软件…

Web端云剪辑解决方案,智能字幕,精准识别语音字幕,一键上轨编辑

无论是企业宣传、个人Vlog、在线教育还是直播带货&#xff0c;高质量的视频内容都是吸引眼球、传递价值的关键。然而&#xff0c;面对繁琐的剪辑流程、高昂的时间成本以及技术门槛&#xff0c;许多创作者往往望而却步。正是洞察到这一市场需求&#xff0c;美摄科技携其创新的We…

解锁MySQL升级秘诀:提升性能、增强安全的必备指南

随着mysql不断演进&#xff0c;旧的版本不断地会发现新的漏洞&#xff0c;为修复漏洞体验新版本的功能&#xff0c;就需要对数据库进行升级操作。 升级注意点 备份&#xff01;备份&#xff01;备份&#xff01; 1.从5.6升级到5.7需首先升级到5.6最新版&#xff1b;不支持跨…

消息中间件常见面试题(RabbitMQ)

MQ场景&#xff1a; 异步发送&#xff08;验证码、短信、邮件&#xff09;MySQL、Redis、ES之间的数据同步分布式事务等 一、RabbitMQ 1.1 消息不丢失 提问&#xff1a;如果保证消息不丢失呢&#xff1f; 流程&#xff1a;生产者将消息发送给交换机&#xff0c;交换机发送给…

css实现类似歌词字体渐变的效果

1、HTML <view class"title">哈哈哈哈哈</view> 2、CSS animation: hue 6s infinite linear;background-image: linear-gradient(135deg, #fc00c7 0%, #1c4efd 54%, #00aded 100%);-webkit-text-fill-color: transparent;color: transparent;-webkit-ba…

【**倒计时,人工智能的ASI时代几年内将至-samaltman深夜发文预言**】

在未来的几十年里&#xff0c;我们将能够做到我们的祖辈认为像魔术一样的事情。 这是Sama Ltman博文的第一句话。技术进步加速&#xff1a;随着时间的推移&#xff0c;人类的能力显著提高&#xff0c;我们能够完成前人认为不可能的事情。他认为&#xff1a; 我们的能力增强不…

Spring 核心

Spring 核心 这篇文章&#xff0c;我们换个思路来学习&#xff0c;来践行一下以始为终&#xff0c;以面试题为引来重温一下Spring&#xff0c;毕竟孔子曾说&#xff0c;“温故而知新&#xff0c;可以为师矣。” &#xff0c;可以通过这个链接看看有哪些常见的面试题 Spring 面…