Leetcode编程练习

面试题-消失的数字

. - 力扣(LeetCode)

class Solution 
{
public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start += 1;end -= 1;}}void rotate(vector<int>& nums, int k) {// 防止被套圈k %= nums.size();// 先整体逆置reverse(nums, 0, nums.size() - 1);// 1. 将逆置到前面的逆置正常顺序reverse(nums, 0, k - 1);// 2. 将后面的也转换正常reverse(nums, k, nums.size() - 1);}
};
  1. 初始化:
    • int N = nums.size();:获取输入数组 nums 的大小,这表示从0到N-1的连续整数中应该有多少个数字。
    • int x = 0;:初始化一个变量 x,用于存储异或运算的结果。
  2. 第一个for循环:
    • 遍历数组 nums 中的每一个元素,并与 x 进行异或运算。
    • 因为异或运算的性质是:任何数与0异或都等于它本身;任何数与自身异或都等于0。所以,当遍历完数组后,x 中存储的是从0到N-1的所有整数与数组 nums 中实际存在的整数的异或结果。
  3. 第二个for循环:
    • 这个循环从0开始,到N(包括N)结束,与 x 进行异或运算。
    • 理想情况下,如果数组 nums 是完整的,即包含从0到N-1的所有整数,那么在这个循环结束后,x 的值应该是0(因为所有数字都异或了自己,结果为0)。
    • 但是,由于数组 nums 中缺失了一个数字,所以在这个循环结束后,x 的值将是缺失的那个数字(因为缺失的那个数字只被异或了一次,而其他数字都被异或了两次,结果为0)。
  4. 返回结果:
    • 最后,函数返回 x,即缺失的那个数字。

注意:第二个for循环中的 j 是从0遍历到 N(包括N),但实际上,当 j 等于 N 时,它并不与任何数组中的元素异或(因为数组索引是从0到N-1),但这并不影响结果,因为 N 与任何其他数字异或都会得到非零值(除非该数字也是 N,但这种情况不可能发生,因为数组中不可能有 N 这个元素)。

轮转数组

. - 力扣(LeetCode)

class Solution 
{
public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start += 1;end -= 1;}}void rotate(vector<int>& nums, int k) {// 防止被套圈k %= nums.size();// 先整体逆置reverse(nums, 0, nums.size() - 1);// 1. 将逆置到前面的逆置正常顺序reverse(nums, 0, k - 1);// 2. 将后面的也转换正常reverse(nums, k, nums.size() - 1);}
};
  1. reverse 函数是一个辅助函数,用于反转数组 nums 中从索引 start 到 end(不包括 end)的部分。这个函数使用了双指针法,从两端开始交换元素,直到两个指针相遇或交叉。
  2. rotate 函数是主要的旋转函数。首先,它对 k 取模数组的长度 nums.size(),以确保 k 不会超出数组的范围。这是因为如果 k 大于数组的长度,那么实际上只需要旋转 k % nums.size() 次即可。
  3. 接下来,rotate 函数执行三次反转操作:
    • 第一次反转:对整个数组 nums 进行反转。这样,原本在末尾的 k 个元素现在就被移动到了数组的开头,但顺序是反的。
    • 第二次反转:对数组的前 k 个元素(索引从 0 到 k-1)进行反转。这样,原本在数组开头的 k 个元素(但顺序是反的)现在就被转回了正常顺序。
    • 第三次反转:对数组从索引 k 到末尾的部分进行反转。这样,剩余的元素也被转回了正常顺序。

经过这三次反转操作后,数组就被成功地旋转了 k 个位置。

这种方法的关键在于理解如何通过反转操作来重新排列数组中的元素。它避免了使用额外的空间,并且时间复杂度为 O(n),其中 n 是数组的长度。

回文链表

链表的回文结构_牛客题霸_牛客网

class PalindromeList
{
public:bool chkPalindrome(ListNode* A){// 如果链表为空或者只有一个节点,那么它一定是回文的if (A == nullptr || A->next == nullptr)return true;// 快慢指针找出中间节点,slow 指针指向链表中间位置(如果链表长度是奇数,则指向中间节点;如果是偶数,则指向中间两个节点的第一个)ListNode* slow = A;ListNode* fast = A;while (fast != nullptr && fast->next != nullptr){fast = fast->next->next;slow = slow->next;}// 反转后半部分链表,prev 指针指向反转后的链表头部ListNode* prev = nullptr;ListNode* curr = slow;while (curr != nullptr){ListNode* temp = curr->next;curr->next = prev;prev = curr;curr = temp;}// 检查回文,p1 指针指向链表头部,p2 指针指向反转后的链表头部ListNode* p1 = A;ListNode* p2 = prev;while (p1 != nullptr && p2 != nullptr){// 如果节点值不相等,则链表不是回文的if (p1->val != p2->val){return false;}p1 = p1->next;p2 = p2->next;}// 链表是回文的return true;}
};

找中间节点

// 快慢指针找出中间节点,slow 指针指向链表中间位置(如果链表长度是奇数,则指向中间节点;如果是偶数,则指向中间两个节点的第一个)ListNode* slow = A;ListNode* fast = A;while (fast != nullptr && fast->next != nullptr){fast = fast->next->next;slow = slow->next;}

定义了两个指针 slow 和 fast,初始时它们都指向链表的头部。在循环中,fast 指针每次向前移动两步,而 slow 指针每次向前移动一步。当 fast 指针到达链表的末尾时,slow 指针就会指向链表的中间位置。

  • 该步骤用来分割链表,以便后续操作

反转后半链表

// 反转后半部分链表,prev 指针指向反转后的链表头部ListNode* prev = nullptr;ListNode* curr = slow;while (curr != nullptr){ListNode* temp = curr->next;curr->next = prev;prev = curr;curr = temp;}

就是将后半部分的链表每个节点next指向前一个节点,这样就形成了反转链表,链表头是翻转前的最后一个节点。
值得注意:前半部分的最后一个节点的next还是指向翻转前的后半部分第一个节点(也就是后半部分反转后的最后一个节点),所以在后续进行判断两个链表是否相同的时候直接向后进行判断就可以。

检查两个链表

        // 检查回文,p1 指针指向链表头部,p2 指针指向反转后的链表头部ListNode* p1 = A;ListNode* p2 = prev;while (p1 != nullptr && p2 != nullptr){// 如果节点值不相等,则链表不是回文的if (p1->val != p2->val){return false;}p1 = p1->next;p2 = p2->next;}// 链表是回文的return true;}

使用一个循环来比较两个指针所指向的节点值。如果发现任何一个节点值不相等,就意味着链表不是回文的,我们直接返回 false。如果循环完成后都没有发现不相等的节点值,那么链表就是回文的,我们返回 true。

相交链表

class Solution 
{
public:ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {if (headA == nullptr || headB == nullptr) {return nullptr;}ListNode* pA = headA, * pB = headB;// 如果有交点,那么在第一次相同的时候就会返回pawhile (pA != pB) {pA = pA == nullptr ? headB : pA->next;pB = pB == nullptr ? headA : pB->next;}// 换道思想,如果两个链表长度不同,可以理解为补长度,// 然后重新回到另一个链表的头的那个长度和和另一个指针指向剩余的长度相同,然后就可以达到一个相同的交点return pA;}
};

对于以下代码可能理解的时候存在一些误区,所以我作出以下思路整理:

        while (pA != pB) {pA = pA == nullptr ? headB : pA->next;pB = pB == nullptr ? headA : pB->next;}// 换道思想,如果两个链表长度不同,可以理解为补长度,// 然后重新回到另一个链表的头的那个长度和和另一个指针指向剩余的长度相同,然后就可以达到一个相同的交点return pA;

image.png

  1. 假设链表 A 和链表 B 的长度不同,我们让指针从另一个链表的头部重新开始遍历,实际上就是将短链表的指针向前移动了长度差的距离,以此来“补齐长度”。
  2. 当两个指针再次开始从头部出发时,它们之间的距离就会相等,这时它们就像在同一起跑线上开始了新的竞赛。
  3. 当两个指针在两个链表中遍历时,它们会同时移动相同的步数。这样,当它们到达交点时,它们就会处于相同的位置,即使两个链表的长度不同。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI预测体彩排3第3套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多&#xff0c;回来比较晚了&#xff0c;趁着还未开奖&#xff0c;赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日排列3预测结果 6-7码定位方案如下&#xff1a; 百位&#xff1a;2、3、1、5、0、6 十位&#xff1a;4、3、6、8、0、9 个位&#xf…

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案&#xff0c;主要是为了满足快速量产需求&#xff0c;且受制于研发资金不足限制&#xff1b; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案&#xff0c;mobileye开发节奏无法紧跟特斯拉需求&#xff…

嵌入式学习

笔记 作业 有如下结构体 struct Student{ char name[16]; int age; double math_score; double chinese_score; double english_score; double physics_score; double chemistry…

Vue 基础语法

【1】模板语法 &#xff08;1&#xff09;差值表达式 {{}}是 Vue.js 中的文本插值表达式。 它用于在模板中输出数据或表达式的值。当数据或表达式的值发生变化时&#xff0c;插值表达式会自动更新。 补充&#xff1a;三目运算符 它的基本语法是 Condition ? A : B&#xff0…

设计模式Java实现-工厂模式

✨这里是第七人格的博客✨小七&#xff0c;欢迎您的到来~✨ &#x1f345;系列专栏&#xff1a;设计模式&#x1f345; ✈️本篇内容: 工厂模式✈️ &#x1f371;本篇收录完整代码地址&#xff1a;https://gitee.com/diqirenge/design-pattern &#x1f371; 楔子 记得刚…

Junit 测试中如何对异常进行断言

本文对在 Junit 测试中如何对异常进行断言的几种方法进行说明。 使用 Junit 5 如果你使用 Junit 5 的话,你可以直接使用 assertThrows 方法来对异常进行断言。 代码如下: Exception exception = assertThrows(NumberFormatException.class, () -> {new Integer("on…

Java的java.util.concurrent.ExecutorService简介

在Java并发编程的璀璨星空中&#xff0c;ExecutorService无疑是那颗最耀眼的明星。它不仅是Java并发编程的核心组件之一&#xff0c;更是构建高并发、高性能应用的秘密武器。今天&#xff0c;我们就来一场说走就走的探索之旅&#xff0c;揭开它的神秘面纱&#xff01; &#x1…

wordpress外贸建站公司歪建站新版网站上线

wordpress外贸建站公司 歪猫建站 歪猫WordPress外贸建站&#xff0c;专业从事WordPress多语言外贸小语种网站建设与外贸网站海个推广、Google SEO搜索引擎优化等服务。 https://www.waimaoyes.com/dongguan

【1小时掌握速通深度学习面试6】图神经网络-下

目录 23. GraphSage 24.简述图神经网络的推理机制在其他领域中的应用 与传统NN的区别&#xff08;GNN优点&#xff09; 23. GraphSage GraphSage出现之前的图网络方法需要图中所有的顶点在训练embedding的时候都出现&#xff0c;这些的方法本质上是transductive&#xff0c…

计算机是如何执行指令的

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

【数据结构】有关环形链表题目的总结

文章目录 引入 - 快慢指针思考 - 快慢指针行走步数进阶 - 寻找环形链表的头 引入 - 快慢指针 141-环形链表 - Leetcode 关于这道题&#xff0c;大家可以利用快慢指针&#xff0c;一个每次走两步&#xff0c;一个每次走一步&#xff0c;只要他们有一次相撞了就代表说这是一个链…

Django实验(远程访问+图片显示)

众所周知&#xff0c;Python除了不能生孩子什么都会。Python也是可以做web服务的。 Python做web有一个重点优势是&#xff1a;做一个快速的AI Demo。 第一步&#xff1a;安装一个版本5.0以上django 第二步&#xff1a;构建咱们的Django工程&#xff0c;我取名为BBQ django-adm…