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.mzph.cn/diannao/7008.shtml

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

相关文章

Rust语言系统编程实战(小北学习笔记)

前言 进入大学以来&#xff08;计算机应用技术——大数据方向&#xff09;&#xff0c;就像很多程序猿&#x1f412;一样&#xff0c;小北开始每学期学习一种新的编程语言。通过学习另一个编程语言&#xff0c;可以了解很多规范和规则&#xff0c;并得到了一些想法&#xff0c;…

如何使用IntelliJ IDEA SSH连接本地Linux服务器远程开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

MES生产系统与数字孪生双重结合:智慧制造工厂的新引擎

随着数字化浪潮的推动&#xff0c;制造行业正在经历着前所未有的变革。在这个变革的浪潮中&#xff0c;MES生产制造系统与数字孪生技术的深度融合成为了制造工厂未来发展的核心驱动力。这种结合不仅提升了生产效率&#xff0c;优化了资源配置&#xff0c;降低了运营成本&#x…

德国韦纳WENAROLL滚压刀,液压缸,滚光刀,挤压刀,滚轧刀

德国韦纳WENAROLL滚压刀,液压缸&#xff0c;滚光刀,挤压刀&#xff0c;滚轧刀&#xff08;百度一下&#xff0c;西安尚融&#xff09; 德国韦纳&#xff08;WENAROLL&#xff09;的滚压刀、液压缸、滚光刀、挤压刀和滚轧刀在工业领域享有很高的声誉&#xff0c;这些产品因其高…

安卓跑马灯效果

跑马灯效果 当一行文本的内容太多&#xff0c;导致无法全部显示&#xff0c;也不想分行展示时&#xff0c;只能让文字从左向右滚动显示&#xff0c;类 似于跑马灯。电视在播报突发新闻时经常在屏幕下方轮播消息文字&#xff0c;比如“ 快讯&#xff1a;我国选手 *** 在刚刚结束…

力扣每日一题115:不同的子序列

题目 困难 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s "rabbbit", t "rabbit" 输出&#xff1a;3 解释&#xff1a; 如下所示, 有 3 种…

9.3.k8s的控制器资源(deployment部署控制器)

目录 一、deployment部署控制器概念 二、deployment资源的清单编写 三、小结 功能 使用场景 原理 四、deployment实现升级和回滚 1.编辑deployment资源清单&#xff08;v1版本&#xff09; 2.创建service资源用于访问 ​编辑 3.修改deploy清单中pod镜像版本为V2 4…

idea2023.2.5的控制台动态配置当前环境

一、idea2023.2.5的控制台动态配置当前环境 1.1、idea版本 1.2、配置方式 1.2.1、方式一 1.2.2、方式二 1.3、参考 https://blog.csdn.net/xiaoheihai666/article/details/127757658

【go项目01_学习记录04】

学习记录 1 集成 Gorilla Mux1.1 为什么不选择 HttpRouter&#xff1f;1.2 安装 gorilla/mux1.3 使用 gorilla/mux1.4 迁移到 Gorilla Mux1.4.1 新增 homeHandler1.4.2 指定 Methods () 来区分请求方法1.4.3 请求路径参数和正则匹配1.4.4 命名路由与链接生成 1 集成 Gorilla Mu…

性能拉满!NeRF与SLAM结合,最新SOTA参数减少30倍!

给大家推荐一个非常新兴的&#xff0c;有大量创新点可以挖掘的好方向&#xff1a;NeRF结合SLAM。 通过结合NeRF的高质量三维场景重建能力和SLAM的动态定位与环境理解能力&#xff0c;我们可以利用逐帧收集的数据&#xff0c;逐渐构建出高质量的3D场景模型&#xff0c;实现更加…

Linux migrate_type初步探索

1、基础知识 我们都知道Linux内存组织管理结构架构&#xff0c;顶层是struct pglist_data&#xff0c;然后再到struct zone&#xff0c;最后是struct page。大概的管理结构是这样的&#xff1a; 根据物理内存的地址范围可划分不同的zone&#xff0c;每个zone里的内存由buddy…

【企业动态】东胜物联正式加入EnOcean联盟,携手为智慧楼宇及能源管理提供更稳定的硬件解决方案

2024年4月&#xff0c;东胜物联&#xff08;Dusun&#xff09;宣布正式加入EnOcean联盟。EnOcean联盟是一个由来自建筑行业的400多家公司组成的全球性组织。它以EnOcean无线标准&#xff08;ISO/IEC 14543-3-10/11&#xff09;为基础&#xff0c;为可持续建筑自动化建立了创新的…

基于K8S构建Jenkins持续集成平台

文章目录 安装和配置NFSNFS简介NFS安装 在Kubernetes安装Jenkins-Master创建NFS client provisioner安装Jenkins-Master Jenkins与Kubernetes整合实现Jenkins与Kubernetes整合构建Jenkins-Slave自定义镜像 JenkinsKubernetesDocker完成微服务持续集成拉取代码&#xff0c;构建镜…

全栈低代码:前后端业务需求实现100%覆盖!

工具背景&#xff1a; 织信低代码平台“组件设计器”功能专为对个性化定制页面需求较为强烈的用户准备的&#xff0c;该功能组件十分丰富和强大&#xff0c;还融合了AI智能&#xff0c;能够帮助用户0成本起步&#xff0c;平均花1-2个小时就能快速构建一套网站、APP、小程序。 …

期权如何开户的流程是什么样的?

今天期权懂带你了解期权如何开户的流程是什么样的&#xff1f;期权账户开户是指投资者向期权经纪商或金融机构提交申请&#xff0c;以便可以在期权市场上进行交易并持有期权合约的账户开设过程。 期权如何开户的流程是什么样的&#xff1f; 1. 投资者参与营业部提供的股票期权…

Windows环境下VSCode C环境配置

前言&#xff1a; 本文记录了自己在配置 Windows环境下 VSCode C开发环境的遇到的问题和解决方法。 参考: vscode c语言没有代码提示_clangd提示不生效-CSDN博客 VSCODE无法跳转_vscode 不能跳转-CSDN博客 vscode c/c环境配置&#xff08;MinGW&#xff09;调用第三官方库…

【软件工程】测试

目录 前言软件测试的目标测试准则测试方法测试方案&#xff08;重点&#xff09;白盒测试&#xff08;重点&#xff09;逻辑覆盖测试语句覆盖判定覆盖&#xff08;分支覆盖&#xff09;条件覆盖判定/条件覆盖条件组合覆盖总结 基本路径覆盖法 黑盒测试等价类法边界值分析法 软件…

导数和偏导数练习

导数题目列表 偏导数题目列表 这里是上述50个导数和偏导数练习题的答案&#xff1a; 导数答案列表 偏导数答案列表 更多问题咨询 Cos机器人

Linux之命令行参数与环境变量

命令行参数&环境变量 命令行参数 main函数也是一个函数&#xff0c;其实也可以携带参数的 int main( int argc, char *argv[ ], char *envp[ ] ) {program-statements } 那这里是有三个参数的: 第一个参数&#xff1a; argc 是个整型变量&#xff0c;表示命令行参数的个数…

ABAP 第二代增强-采购申请子屏幕增强

文章目录 第二代增强-采购申请子屏幕增强需求实现过程创建项目运行效果客户屏幕的PBO全局变量获取数据更新数据运行效果查询底表修改数据 第二代增强-采购申请子屏幕增强 需求 实现过程 创建项目 运行效果 客户屏幕的PBO 全局变量 *&------------------------------------…