单链表经典OJ题(四)

news2024/11/26 20:35:52

目录

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.coloradmin.cn/o/1216876.html

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

相关文章

场景图形管理-多视图与相机(3)

在OSG中多视图的管理是通过osgViewer::CompositeViewer类来实现的。该类负责多个视图的管理及同步工作&#xff0c;继承自osgViewer;:ViewerBase类&#xff0c;继承关系图如图8-13所示 图8-13 osgViewer::CompositeViewer 的继承关系图 在前面已经讲到&#xff0c;osgViewer:Vi…

GDPU 商务英语 [初入职场](持续更新……)

&#x1f468;‍&#x1f3eb; 商务英语&#xff08;初入职场电子书PDF&#xff09;提取码&#xff1a;t9ri Unit 1 Job-seeking ✨ 单词 recruitment n. 招聘physical adj. 有形的;物质的profitability n. 盈利launch vt. 将(新产品等)投放市场budget n. 预算account for 占…

Qt QLable 字符过长省略

前言&#xff1a; 项目中常用到字符过长问题&#xff0c;Qt默认的省略并不好用&#xff0c;不是自己想要的&#xff1b; QFontMetri 可使用 QFontMetri 当text的像素宽度超过width&#xff0c;将返回字符串的一个省略版本取决于mode。否则将返回原字符串&#xff1b; mode…

工厂是否需要单独的设备管理部门

设备是工厂生产过程中不可或缺的重要资源&#xff0c;其正常运行和有效管理对于工厂的生产效率和质量至关重要。为了确保设备的良好状态和高效运行&#xff0c;许多工厂选择设立专门的设备管理部门。本文将探讨设备管理部门的职责、与生产部门下的点检维保团队的区别&#xff0…

PyCharm 远程连接服务器并使用服务器的 Jupyter 环境

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

C/C++---------------LeetCode第1189. “气球” 的最大数量

气球的最大数量 题目及要求统计法在main内使用 题目及要求 给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 “balloon”&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 “ba…

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

目录 一、cenc-aes-ctr 原理介绍 二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr 三、加密工具---ffmpeg 四、播放---ffplay 五、总结 ​​​​​​​一、cenc-aes-ctr 原理介绍 加密算法&#xff1a;CENC-AES-CTR 使用 AES&#xff08;Advanced Encryption Standard&…

Java GUI实现贪吃蛇游戏

贪吃蛇是一款经典的游戏&#xff0c;玩法相对简单但富有挑战性。以下是贪吃蛇游戏的基本玩法说明&#xff1a; 目标&#xff1a;控制一条蛇&#xff0c;在游戏区域内吃到尽可能多的食物&#xff0c;使蛇身变长&#xff0c;同时避免撞到自己的身体或游戏区域的边界。 控制&…

SQL题

[极客大挑战 2019]EasySQL 进行简单的尝试&#xff0c;就知道是单引号的字符型注入 万能密码进行一个简单的尝试 结果就出来了 还是要了解一下原理 输入的是1&#xff0c;形成的sql语句是错误的SELECT*FROM table_name WHERE username1and password123; 第一个单引号和第二个…

[代码实战和详解]VGG16

VGG16 详解 我的github代码实现&#xff1a;vgg16 我们在vgg16神经网络上训练了SIGNS数据集&#xff0c;这是一个分类的数据集&#xff0c;在我的github上有介绍怎么下载数据集以及如何训练。 VGG16是一个卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;它在2014年…

国内领先的五大API接口供应商

API&#xff08;Application Programming Interface&#xff09;接口&#xff0c;现在很多应用系统中常用的开放接口&#xff0c;对接相应的系统、软件功能&#xff0c;简化专业化的程序开发。作者用过的国内比较稳定的API接口供应商有如下几家&#xff0c;大家可以参考选择&am…

论文学习——THE USTC SYSTEM FOR ADRESS-M CHALLENGE

文章目录 引言正文Abstract模型基本结构模型效果汇总 Introduction介绍跨语言任务的独特性思路启发和变化如何使用预定义好的音频特征如何使用预定义好的语言模型——语言模型中获取韵律信息结果说明 Dataset数据集Mthods方法使用设计好的特征进行AD检测使用的特征分类和训练方…

【原创】java+swing+mysql通讯录管理系统设计与实现

前言&#xff1a; 通讯录管理系统是一个设计和实现个人或组织之间联系人信息管理的系统。该系统可能涵盖了联系人的详细信息&#xff0c;如姓名、电话号码、电子邮件地址、地址等&#xff0c;并提供了对联系人信息进行添加、删除、修改、查询等操作的功能。通讯录管理系统旨在…

Android设计模式--状态模式

真知即所以为行&#xff0c;不行不足谓之知 一&#xff0c;定义 当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 这么说可能很难理解&#xff0c;通俗来讲就是当一个对象它有多种状态的时候&#xff0c;把每一种状态的行为…

【科普】储能EMS的嵌入式系统该如何选择?

来源&#xff1a;飞凌嵌入式官网 引言 储能EMS&#xff08;能源管理系统&#xff09;是专门针对储能系统设计和实施的管理系统&#xff0c;它在新型储能系统领域起到了至关重要的作用。储能EMS能够帮助企业或者机构实现储能设备的高效、安全和可靠管理&#xff0c;优化能源的储…

LeetCode热题100——二分查找

二分查找 1. 搜索插入位置2. 搜素二维矩阵3. 在排序数组中查找第一个和最后一个元素位置 1. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 // 题…

vue-router配置

1、路由安装 npm install vue-router4 2、创建router目录 3、编辑文件且引入router包 4、main.js引入

【C++面向对象】13. 接口 / 抽象类*

文章目录 【 1. 抽象类 】1.1 抽象类的定义1.2 抽象类的应用条件1.3 实例 【 2. 设计策略 】 接口描述了类的行为和功能&#xff0c;而不需要完成类的特定实现。C 接口是使用 抽象类&#xff08;abstract base class&#xff0c;也称为ABC&#xff09; 来实现的。 【 1. 抽象类…

《C++避坑神器·二十》C++智能指针简单使用

智能指针&#xff0c;自动释放所指向的对象。 头文件 #include <memory>shared_ptr 允许多个指针指向同一个对象 unique_ptr 独占所指向的对象 weak_ptr 指向shared_ptr所管理的对象 作用原理&#xff1a;在函数作用域结束时调用析构函数自动释放资源。 shared_ptr: …