【LeetCode】挑战100天 Day17(热题+面试经典150题)

【LeetCode】挑战100天 Day17(热题+面试经典150题)

  • 一、LeetCode介绍
  • [二、LeetCode 热题 HOT 100-19](#二、LeetCode 热题 HOT 100-19)
    • [2.1 题目](#2.1 题目)
    • [2.2 题解](#2.2 题解)
  • [三、面试经典 150 题-19](#三、面试经典 150 题-19)
    • [3.1 题目](#3.1 题目)
    • [3.2 题解](#3.2 题解)

一、LeetCode介绍

LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序员、计算机科学专业学生和技术爱好者等人群,旨在帮助他们提高算法和编程技能。LeetCode上的问题通常来自各种技术公司的面试题目,因此它也是程序员面试准备的重要资源之一。

LeetCode上的问题涵盖了各种难度级别,从入门级到专家级都有不同难度的题目可供练习。用户可以选择使用不同的编程语言提交答案,LeetCode能够对结果进行评估并返回测试结果。

除了题目外,LeetCode还提供了讨论区、排行榜等社区功能,用户可以在这里交流学习心得、解决疑难问题,并与其他用户比较自己的做题成绩。

挑战100天 AI In LeetCode是基于LeetCode题库,借助AI的能力进行解题、并学习其解题过程。

二、LeetCode 热题 HOT 100-19

2.1 题目

删除链表的倒数第 N 个结点

java 复制代码
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:


输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:

输入:head = [1], n = 1
输出:[]
示例 3:

输入:head = [1,2], n = 1
输出:[1]
 

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

2.2 题解

解题思路:

  1. 首先,我们可以使用双指针来解决这个问题。定义两个指针fast和slow,初始时都指向链表的头结点。
  2. 将fast指针向前移动n+1步,使得fast指针与slow指针之间相隔n个结点。
  3. 然后,同时将fast指针和slow指针向前移动,直到fast指针达到链表的末尾。
  4. 此时,slow指针指向的结点就是需要删除的倒数第n个结点的前一个结点。
  5. 我们修改slow指针的next指针,将其指向需要删除的倒数第n个结点的下一个结点,即完成了删除操作。
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 removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode fast = dummy;
        ListNode slow = dummy;

        // 将fast指针向前移动n+1步
        for (int i = 0; i <= n; i++) {
            fast = fast.next;
        }

        // 同时移动fast和slow指针
        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }

        // 修改slow指针的next指针
        slow.next = slow.next.next;

        return dummy.next;
    }
}

三、面试经典 150 题-19

数组 / 字符串

3.1 题目

反转字符串中的单词

java 复制代码
给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

 

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
 

提示:

1 <= s.length <= 10^4
s 包含英文大小写字母、数字和空格 ' '
s 中 至少存在一个 单词

3.2 题解

解题思路:

  1. 我们可以从字符串末尾开始遍历,使用StringBuilder来构建结果字符串。
  2. 当遇到空格时,表示当前单词的结束位置为end,我们将该单词添加到结果字符串中。
  3. 遍历完成后,得到了反转后的单词顺序,但是可能包含多余的空格,我们需要去除多余的空格。
  4. 最后返回处理后的结果字符串即可。
java 复制代码
public class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = new StringBuilder();
        int end = s.length();

        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) == ' ') {
                end = i;
            } else if (i == 0 || s.charAt(i - 1) == ' ') {
                if (sb.length() != 0) {
                    sb.append(' ');
                }
                sb.append(s, i, end);
            }
        }

        return sb.toString();
    }
}

至此,挑战100天 AI In LeetCode Day17(热题+面试经典150题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。

相关推荐
怕浪猫3 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i4 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
Evand J5 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
leikooo5 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
weixin_307779136 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
Ivanqhz6 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
朝朝辞暮i6 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
沙漠之主6 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
朝朝辞暮i7 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
FPGA小徐7 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络