【LeetCode刷题指南】--消失的数字,轮转数组,移除元素

发布于:2025-06-25 ⋅ 阅读:(18) ⋅ 点赞:(0)

🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。 

 前言:在之前的C语言刷题集中我们刷了很多IO类型的基础编程题,但是随着数据结构往后的学习以及企业面试的要求,我们还需要对接口型的题目进行练习,博主在这里准备了新的《LeetCode刷题指南》专栏给大家分享一些我自己在力扣上面写过的题目,提供一些我的解题思路。个人实力有限,欢迎大家补充和指正。


目录

1.消失的数字

2.轮转数组 

3. 移除元素


1.消失的数字

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

 思路:使用异或的方法

解题过程:

1.这题的思路有点类似于单身狗数,但是会难一点,我们先定义一个变量ret初始化为0,把它和数组中的所有元素异或

2.注意0异或任何数都还是那个数本身,两个相同的数异或后为0,还有就是异或支持交换律。

3.所以我们再将异或完数组中所有元素的ret和0到numsSize所有数异或,如果是数组中存在的数这时候就都会变为0,最后只会剩下数组中消失的那个元素了,返回ret即可。

具体解题过程图示如下:

复杂度: 

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

代码演示:

int missingNumber(int* nums, int numsSize) {
    int ret=0;
    for(int i=0;i<numsSize;i++)
    {
        ret^=nums[i];
    }
    for(int j=0;j<=numsSize;j++)
    {
        ret^=j;
    }
    return ret;
}

2.轮转数组 

题目链接:189. 轮转数组 - 力扣(LeetCode)

思路:

使用三次逆置实现数组的轮转,第一次逆置前n-k个,第二次逆置后k个,最后整体逆置一次

解题过程:

1.先实现一个数组逆置的函数,利用双指针交换法,两个指针分别指向数组首尾,交换后向中间移动,直到相遇时结束

2.有了逆置函数之后,我们就可以通过调用这个函数来实现我们的三次逆置了

--第一次逆置前n-k个,那我们传的左下标就是0,右下标是numsSize-1-k

--第二次逆置后k个,那我们传的左下标就是numsSize-k,右下标是numsSize-1

--最后一次整体逆置,我们传的左下标是0,右下标是numsSize-1,也就是数组的开头和结尾

3.这里需要考虑到k大于numsSize的情况,可能会存在一些问题,我们只需要用k%numsSize就可以很好的解决掉了,而且不会影响到k小于numsSize的情况

 具体解题过程图示如下:

复杂度:

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

代码演示:

void reverse(int*nums,int left,int right)
{
    while(left<right)
    {
        int temp=nums[left];
        nums[left]=nums[right];
        nums[right]=temp;
        left++;
        right--;
    }
}

void rotate(int* nums, int numsSize, int k) {
    k=k%numsSize;
    reverse(nums,0,numsSize-1-k);
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);
}


3. 移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

思路:

使用双指针实现元素的移除,一个指针用来记录删除指定元素后的数组,一个用来遍历数组找需要删的元素

解题过程:

1.先定义两个指针,dest和cur,利用cur去遍历这个数组

  • 当数组当前元素不等于需要移除的元素时,用dest记录下来,将cur指针指向的元素复制到dest指针的位置,然后dest和cur都++指向下一个位置
    • 当数组当前元素等于需要移除的元素时,dest不动,cur++继续判断下一个元素

    2.右指针遍历完输入的数组后,dest的值就算符合条件的输出数组的长度

    具体解题过程图示如下:

    复杂度:

    • 时间复杂度:O(N)
    • 空间复杂度:O(1)

    代码演示:

    int removeElement(int* nums, int numsSize, int val) {
        int dest=0;
        int cur=0;
        while(cur<numsSize)
        {
            if(nums[cur]!=val)
            {
                nums[dest++]=nums[cur++];
            }
            else
            {
                cur++;
            }
        }
        return dest;
    }
    
    

    往期回顾:

     【数据结构初阶】--算法复杂度的深度解析

     【手把手带你刷好题】--C语言基础编程题(六)

    【手把手带你刷好题】--C语言基础编程题(七)

    结语:本篇文章就到此结束了,《LetetCode刷题指南》中的第一篇博客题目比起之间的C语言刷题集中的题目,肯定会更加复杂一些。而且题目形式也不一样,大家需要注意一下,在这里推荐大家先看看往期回顾中的算法复杂度这篇博客,对其有初步的了解,很多题目都会对复杂度有一定的要求。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。


    网站公告

    今日签到

    点亮在社区的每一天
    去签到