单链表经典OJ题(四)

目录

1、链表中倒数第k个结点

2、消失的数字

3、轮转数组

4、合并两个有序数组

5、数组串联

6、序列中删除指定数字

1、链表中倒数第k个结点

链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)

这道题依然利用双指针法,具体解题思路如下:

1、创建两个指针 fast 和 slow 并让它们开始时指向同一个位置

2、使用一个循环将 fast 指针向前移动 k 步。这样,在循环结束后,如果整个链表长度小于等于 k,则说明无法找到倒数第 k 个节点,直接返回空指针

3、接下来使用另一个循环,在每次迭代中将 fast 和 slow 指针同时向前移动一步,直到达到链表末尾(即 fast 指针为空)

4、最后返回 slow 指针所指向的位置即可得到倒数第 k 个节点

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

/**
 * 
 * @param pListHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
  struct ListNode* fast = pListHead,*slow = pListHead;
  while(k--)
  {
    if(fast == NULL)
        return NULL;
    fast = fast->next;
  }
  while(fast)
  {
    fast = fast->next;
    slow = slow->next;
  }
  return slow;

}

这道题的思路在做题的时候感觉有点不太好想[也有可能是我太废物了🤡]

2、消失的数字

面试题 17.04. 消失的数字 - 力扣(LeetCode)

       令完整数组与不完整数组进行异或运算,两个数组中的数字基本都是两两配对的,它们异或后的结果都为零,而两个数组异或的结果必然是那个没有成对的数字,它就是我们要找的消失的数字

异或运算的规则是:相同为0,不同为1

        题目中给的数组是包含从0n的所有整数,但其中缺了一个,这就证明它是一个没有重复数字的数组,这样我们就可以直接定义一个变量num并初始化为0,用num与完整数组循环异或运算后得到的结果再与不完整数组进行循环异或,这里的num起到一个连接两次异或的作用,同时初始化为0也能保证它在异或过程中不会成为干扰因素(因为0与完整数组中的0异或后结果仍未0)

int missingNumber(int* nums, int numsSize)
{
    //异或的办法是相同为0不同为1
    int num = 0;

    //这里要以后n+1次,表示与完整数组进行异或
    for(int i = 0;i<=numsSize;i++)
    {
        num^=i;
    }

    //这里要异或n次,表示与不完整数组进行异或
    for(int i = 0;i<numsSize;++i)
    {
        num^=nums[i];
    }
    
    return num;
}

3、轮转数组

189. 轮转数组 - 力扣(LeetCode)

        在这里我们可以发现当数组旋转六次时的情况与数组旋转一次时的情况是一样的,即使旋转次数可以随意增加,但是实际上它们旋转后的结果与旋转1、2、3、4、5次是没有区别的,所以为了减少代码执行时间我们利用取余的办法获取数组的真实旋转次数:k = k %  numSize,其中k为数组旋转次数,numSize为数组实际长度

确定了实际旋转的次数后,就可以进行数组轮转操作,具体过程如下图所示:

1、翻转整个数组

        这是因为我们发现每次的轮转都是将后面的数字轮转到前面然后前面的数字向后移动,所以我们直接将靠后的与靠前的元素位置来一个完全大反转,让靠后的数组元素全都跑到前面来

2、先将[0,k-1]范围的数组元素翻转,后将[k,sumSize-1]范围的数组元素翻转

先翻转的部分其实就是我们轮转数组时真正要操作的数组元素,而后翻转的其实就是不用操作的数组元素,由于我们之前进行了一次大翻转,现在我们只需要让它们重归原位即可

至于如何进行局部的反转请看下图:

最终代码如下:

//换位函数
void swap(int* a, int* b) 
{
    int t = *a;
    *a = *b;
    *b = t;
}

//伪双指针一前一后成对交换数组元素
void reverse(int* nums, int start, int end) 
{
    while (start < end)
   {
        swap(&nums[start], &nums[end]);
        start += 1;
        end -= 1;
    }
}

//规定要翻转的数组范围
void rotate(int* nums, int numsSize, int k) 
{
    k %= numsSize;
    reverse(nums, 0, numsSize - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, numsSize - 1);
}

4、合并两个有序数组

88. 合并两个有序数组 - 力扣(LeetCode)

        最讨巧的方法就是直接将一个数组合并至另一个数组的尾部,然后直接利用qsort函数对整个数组进行排序,关于qsort函数的使用请看Qsort函数实现对各类型数组中元素的排序

int cmp(int* a, int* b) {
    return *a - *b;
}

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for (int i = 0; i != n; ++i) {
        nums1[m + i] = nums2[i];
    }
    qsort(nums1, nums1Size, sizeof(int), cmp);
}

它的时间复杂度为 O((m + n) log (m + n)) 较高,我们还有另外一种更简单的方式来解决该问题:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
     while(n) 
        nums1[m+n]=(m==0 || nums1[m-1]<nums2[n-1]) ? nums2[--n] : nums1[--m];
}

        这段代码的时间复杂度为O(n),该函数使用了一个 while 循环来进行逆向合并操作,我们令两个数组在每次循环迭代中,根据比较当前两个数组末尾元素的大小关系,选择将较大的元素放入 nums1 数组末尾,并相应地更新索引。由于nums1.length == m + n 所以不用担心新放入的数组元素会覆盖掉原来的数组元素,提供的数组除了边界情况下都会有多个零来占位。

        需要注意的是:长语句的执行顺序是先进行三元运算符的判断,如果不满足条件则m会先执行减减操作后再使用,所以不用担心[m+n]会产生数组越界的问题,此外由于0<=m,n<=200 所以还需要考虑m=0时的情况。

5、数组串联

1929. 数组串联 - 力扣(LeetCode)

摘选自评论区的一句话:"题库 - 通过率倒序排列 - 点第一个 - 提交 : 我又行了!"

具体解题思路如下:

1、利用malloc开辟一个原来数组内存空间的两倍大小的空间

2、利用两侧for循环将原数组两次放入新开辟的内存空间中,第一层for循环控制要拷贝数组的次数,第二层for循环控制每一个数组元素的拷贝

3、返回指向申请的内存空间起始地址的指针变量connect前,还需要将串联后数组的大小传递给调用者也就是* returnSize = numSize * 2 

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* getConcatenation(int* nums, int numsSize, int* returnSize) {
    int* connect = malloc (sizeof(int)*numsSize*2);
    int p = 0;
    for(int i = 0;i<2;i++)
    {
        for(int j = 0;j<numsSize;j++)
        {
            connect[p++] = nums[j];
        } 
    }
    * returnSize = numsSize*2;
    return connect;
}

6、序列中删除指定数字

序列中删除指定数字_牛客题霸_牛客网 (nowcoder.com)

这道题就当提升自信了......

#include<stdio.h>
int main()
{
    int i,j;
    int n,m;
    //创建一个新的数组arr1用于存放未删除后的数组元素
    int arr1[50];
    //创建一个新的数组arr2用于存放删除后的数组元素
    int arr2[50];
    //选择创建新数组的大小
    scanf("%d",&n);
    
    //创建该新数组
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr1[i]);
    }

    //选择要删除的数字
    scanf("%d",&m);
    
    //利用循环将值不等于m的数字放入新的数组中
    for(i=0,j=0;i<n;i++)
    {
        
        if(m!=arr1[i])
        {
            arr2[j]=arr1[i];
            j++;
        }
    }

    //打印新数组
    for(i=0;i<j;i++)
    {
        printf("%d ",arr2[i]);
    }
    return 0;
}

~over~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一阶滤波器(一阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 转换为差分方程形式 一阶巴特沃斯滤波器Filter Designer参数设计&#xff1a;参考之前的博客Matlab的Filter Designer工具设计二阶低通滤波器 设计采样频率100Hz&#xff0c;截止频率20Hz。 注意&#xff1a;设计参数使用在离散系统中&…

网工内推 | 国企、上市公司售前,CISP/CISSP认证,最高18K*14薪

01 中电福富信息科技有限公司 招聘岗位&#xff1a;售前工程师&#xff08;安全&#xff09; 职责描述&#xff1a; 1、对行业、用户需求、竞争对手等方面提出分析报告&#xff0c;为公司市场方向、产品研发和软件开发提供建议&#xff1b; 2、负责项目售前跟踪、技术支持、需…

java学习part04

1.进制 计算机底层都是二进制&#xff0c;输出统一十进制 2.算符 3.逻辑算符 4.位运算符 38-变量与运算符-位运算符的使用_哔哩哔哩_bilibili 5.条件运算符

这款开源神器,让聚类算法从此变得简单易用

Scikit-Learn 以其提供的多个经过验证的聚类算法而著称。尽管如此&#xff0c;其中大多数都是参数化的&#xff0c;并需要设置集群的数量&#xff0c;这是聚类中最大的挑战之一。 通常&#xff0c;使用迭代方法来决定数据的最佳聚类数量&#xff0c;这意味着你需要多次进行聚类…

洛谷 P3128 [USACO15DEC] Max Flow P

题目链接&#xff1a;P3128 [USACO15DEC] Max Flow P - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 读题注意 从隔间s运输到隔间t&#xff0c;和从隔间t运输到隔间s&#xff0c;都没区别&#xff0c;因为加的压力是一样的&#xff0c;所以这是一个无向图。 并且只有N个节点…

Unity开发之C#基础-异常处理(Try Catch)

前言 其实本来这章应该将栈和队列的 但是后来想想 栈和队列在实际应用很少跟多的是大家了解一下栈和队列的基本常识比如先进先出的是谁后进先出的是谁这种 csdn有很多介绍栈和队列的文章 我觉得都比我理解深刻所以大家可以去搜索参照一下 今天我们继续往下讲解 如何自己主动的…

langchain(1):使用LangChain 调用 openai 的 text/chat model

文章目录 重要参考OPENAI API调用 Text 模型调用 Chat 模型消息角色 Chat 模型 vs Text 模型 通过 LangChain 调用 Text 和 Chat 模型调用 text 模型调用 chat 模型 重要参考 langchain 中文网 langchain api openai api 文档 huggingface LangChain 是一个全方位的、基于大…

VSCode任务tasks.json中的问题匹配器problemMatcher和ProblemPattern的severity属性关系

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 在 VS Code 中&#xff0c;tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题&#xff08;错误、警告等&#xff09;。 ProblemMatcher的JSON对象和其下的子对象pattern…

算法-贪心算法-简单-买卖股票的最佳时机

记录一下算法题的学习4 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这…

狂神说笔记 快速入门Nginx

公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台的用户越来…

华为认证HCIA/HCIP/HCIE考哪个?附系统学习路线

华为认证是什么&#xff1f; 其实就是由华为公司所提出的评价网络工程师专业能力的一个认证&#xff0c;它分为三个级别&#xff0c;分别是这个华为认证的工程师&#xff08;HCIA&#xff09;&#xff0c;华为认证的高级工程师&#xff08;HCIP&#xff09;和华为认证的这个网…

图形学 -- Geometry几何

隐式 implicit 基于给点归类&#xff0c;满足某些关系的点 缺点&#xff1a;不规则表面难以描述&#xff01; algebraic surface 直接用数学公式表示&#xff1a;不直观&#xff01; Constructive Solid Geometry&#xff08;CSG&#xff09; 用简单形状进行加减 distance …

矢量绘图软件 Sketch mac中文版介绍

Sketch mac是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精…

2024长三角智能科技产业博览会(简称:世亚智博会)

2024长三角智能科技产业博览会&#xff08;简称:世亚智博会&#xff09;将于2024年3月份在上海跨国采购会展中心盛大开幕&#xff0c;主题为“数字新时代链接新未来”。展会将紧密围绕“一展、一会、一评选及相关活动”的内容形式&#xff0c;全面展示智能科技产业的最新成果和…

基于 Keras 的图像分类器

引言 深度学习是使用人工神经网络进行机器学习的一个子集&#xff0c;目前已经被证明在图像分类方面非常强大。尽管这些算法的内部工作在数学上是严格的&#xff0c;但 Python 库(比如 keras)使这些问题对我们所有人都可以接近。在本文中&#xff0c;我将介绍一个简单的图像分…

Greek Alphabet Letters Symbols

Upper CaseLower CaseGreek Letter NameEnglish EquivalentSoundΑαAlphaa ΒβBetab ΓγGammag ΔδDeltad ΕεEpsilone ΖζZetaz ΗηEtah ΘθThetath ΙιIotai ΚκKappak ΛλLambdal ΜμMum ΝνNun ΞξXix ΟοOmicrono ΠπPip ΡρRhor Σσ,…

JQuery ajax 提交数据提示:Uncaught TypeError:Illegal invocation

JQuery ajax 提交数据提示&#xff1a;Uncaught TypeError:Illegal invocation 1 问题描述 用jQuery Ajax向DRF接口提交数据的时候&#xff0c;console提示&#xff1a;Uncaught TypeError:Illegal invocation(未捕获的异常&#xff1a;非法调用)。 这个问题可能有两种原因导…

可以写进简历的软件测试项目实战经验(包含电商、银行、app等)

前言&#xff1a; 今天给大家带来几个软件测试项目的实战总结及经验&#xff0c;适合想自学、转行或者面试的朋友&#xff0c;可以写进简历里的那种哦。 1、项目名称: 家电购 项目描述&#xff1a; “家电购”商城系统是基于 web 浏览器的电子商务系统&#xff0c;通过互联网…

基于SpringBoot+Vue的二手物品交易平台

基于SpringBootVue的二手物品交易平台的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 本项目是基于Spring Boot 和 Vue 技术栈构建…

【Java 进阶篇】JQuery 遍历 —— `each()` 方法的奇妙之旅

在前端的世界里&#xff0c;操作元素是我们开发者最为频繁的任务之一。为了更好地操控页面上的元素&#xff0c;JQuery 提供了许多强大的工具&#xff0c;其中 each() 方法是一颗璀璨的明星。本文将深入探讨 each() 方法的原理和用法&#xff0c;带你踏上一场遍历之旅。 起步&…