顺序表|消失的数字|轮转数组|移除元素|合并有序数组|删除有序数组中重复项(C)

news2024/10/25 9:25:27

面试题 17.04. 消失的数字


思路一

排序+遍历
如果下一个不等于上一个数+1,这个下一个数就是消失的数字
时间复杂度 O ( N ⋅ log ⁡ 2 N ) O(N\cdot \log_{2}N) O(Nlog2N)

思路二

0+N等差数列公式计算结果 - 数组中的值,结果就是消失的数字

int missingNumber(int* nums, int numsSize){
    int N = numsSize;
    int ret = N*(N + 1) / 2;
    for (int i = 0; i < N; i++)
    {
        ret -= nums[i];
    }

    return ret;
}
思路三

通过异或解决问题
按位异或,相异为1,相同为0

int missingNumber(int* nums, int numsSize){
    int N = numsSize;
    int x = 0;
    for (int i = 0; i <= N; ++i)
    {
        x ^= i;
    }

    for (int i = 0; i < N; ++i)
    {
        x ^= nums[i];
    }

    return x;
}

0-N有n+1个值,数组中的值比n+1个值少一个

189. 轮转数组


  • 要求时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( 1 ) O(1) O(1)
方法一

依次挪动,每次挪动一个,挪动k次
![[Pasted image 20241012134319.png]]

k很大时,右旋K%=N次
时间复杂度: O ( N 2 ) O(N^{2}) O(N2)
空间复杂度: O ( 1 ) O(1) O(1)

方法二

用空间换时间
开一个额外的数组,把原数组的后k个拷贝到临时数组的前面,前面剩余的拷贝到后面
最后再拷贝回原数组
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( N ) O(N) O(N)
![[Pasted image 20241012204555.png]]

void rotate(int* nums, int numsSize, int k) {
    int* tmp = (int*)malloc(sizeof(int)*numsSize);
    int n = numsSize;
    k %= n;

    memcpy(tmp, nums+n-k, sizeof(int)*k);
    memcpy(tmp+k, nums, sizeof(int)*(n-k));

    memcpy(nums, tmp, sizeof(int)*n);

    free(tmp);
}

![[Pasted image 20241012204322.png]]

  • 先拷贝后k个到tmp数组
  • 再拷贝前n-k个到tmp数组后面
  • 再将tmp数组整体拷贝到原nums数组
方法三

把前n-k个逆置,把后k个逆置,再整体逆置
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( 1 ) O(1) O(1)
![[Pasted image 20241012204054.png]]

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

void rotate(int* nums, int numsSize, int k) {
    k %= numsSize;

    reverse(nums, 0, numsSize - k - 1);
    reverse(nums, numsSize - k, numsSize - 1);
    reverse(nums, 0, numsSize - 1);
}

![[Pasted image 20241012204322.png]]

  • 先逆置前n-k个
  • 再逆置后k个
  • 最后整体逆置

27. 移除元素


方法一

用src指向原数组的首元素
开一个大小相同的新数组叫tmp,指针为dst
把src位置不等于val的值插入到dst位置的数据
再把tmp数组拷贝回去
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( N ) O(N) O(N)
![[Pasted image 20241013133645.png]]

可以做到不需要tmp数组
![[Pasted image 20241013134053.png]]

src和dst一起走,还没有遇到val,src赋给dst就是自己赋给自己
![[Pasted image 20241013134427.png]]

dst遇到val,停下来,src继续走,src和dst拉开距离
![[Pasted image 20241013134637.png]]

![[Pasted image 20241013134739.png]]

src找后面不是val的值,依次尾插给dst覆盖
![[Pasted image 20241013134753.png]]

把3覆盖给dst
![[Pasted image 20241013134809.png]]

src不等于val
![[Pasted image 20241013134825.png]]

把0覆盖给dst
![[Pasted image 20241013134927.png]]

src不等于val
![[Pasted image 20241013134950.png]]

把4覆盖给dst
![[Pasted image 20241013135004.png]]

继续遍历
![[Pasted image 20241013135343.png]]

int removeElement(int* nums, int numsSize, int val) {
    int src = 0, dst = 0;
    while (src < numsSize)
    {
	    //不等于val,覆盖尾插到dst位置,++src,++dst
	    //等于val,++src相当于删除
        if (nums[src] != val)
        {
            nums[dst++] = nums[src++];
        }
        else
        {
            src++;
        }
    }
    return dst;
}

88. 合并两个有序数组


依次比较,取小的,尾插到新数组
保证数组是非递减排序
nums1的大小包含nums2,把nums2归并到nums1里

倒着比较,取大的依次到着插入

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int end1 = m - 1, end2 = n - 1, end = m + n - 1;
    while (end1 >= 0 && end2 >= 0)
    {
        if (nums1[end1] > nums2[end2])
        {
            nums1[end--] = nums1[end1--];
        }
        else
        {
            nums1[end--] = nums2[end2--];
        }
    }
    
    while (end2 >= 0)
    {
        nums1[end--] = nums2[end2--];
    }
}

![[Pasted image 20241013140617.png]]

end1和end2往前遍历,取大的尾插到end
![[Pasted image 20241013140732.png]]

5>3
![[Pasted image 20241013140759.png]]

3>2
![[Pasted image 20241013140853.png]]

2=2,取end2尾插
![[Pasted image 20241013140947.png]]

end2<0,循环结束
当end2遍历完毕后,end1如果有剩余,就不需要变动了
如果end1遍历完,end2还没有,就需要将end2依次尾插到end

26. 删除有序数组中的重复项


![[Pasted image 20241013143039.png]]

如果src位置的值等于dst,就src++,相当于删除重复的值
如果src位置的值不等于dst,先++dst,再把src的值赋给dst,最后让src++

src的值等于dst,src++
![[Pasted image 20241013143448.png]]

这时src的值不等于dst
dst++
![[Pasted image 20241013143512.png]]

src的值赋给dst
![[Pasted image 20241013143535.png]]

++src
![[Pasted image 20241013143548.png]]

继续遍历
![[Pasted image 20241013143615.png]]

src与dst不相等
dst++
![[Pasted image 20241013143635.png]]

src赋给dst
![[Pasted image 20241013143657.png]]

src++
![[Pasted image 20241013143709.png]]

int removeDuplicates(int* nums, int numsSize) {
    int dst = 0;
    int src = 1;
    while (src < numsSize)
    {
        if (nums[src] == nums[dst])
        {
            src++;
        }
        else
        {
            dst++;
            nums[dst] = nums[src];
            src++;
        }
    }
    return dst + 1;
}

dst是最后一个元素的下标
+1才是长度

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

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

相关文章

基于海市蜃楼算法(Fata Morgana Algorithm ,FATA)的多无人机协同三维路径规划(提供MATLAB代码)

一、海市蜃楼算法 海市蜃楼算法&#xff08;Fata Morgana Algorithm &#xff0c;FATA&#xff09;是2024年提出一种新型的群体智能优化算法&#xff0c;它的设计灵感来源于自然现象中的海市蜃楼形成过程。FATA算法通过模仿光线在不均匀介质中的传播方式&#xff0c;提出了两种…

日语学习者福音:4大翻译软件集锦,总有一款适合你!

现在全球化了&#xff0c;学个外语&#xff0c;尤其是日语这种很有魅力的语言&#xff0c;成了很多人的愿望。不管是为了方便旅行&#xff0c;还是喜欢日本文化&#xff0c;或者想在工作中更有竞争力&#xff0c;学日语都挺重要的。学语言不容易&#xff0c;特别是遇到难懂的句…

C#实现Punycode编码/解码

测试代码 string word "我爱你"; string idn "我爱你.中国"; string wordCode PunyCode.Encode(word); string punycode PunyCode.IDN2Punycode(idn);Console.WriteLine(word); Console.WriteLine(wordCode); Console.WriteLine(PunyCode.Decode(word…

【工欲善其事】巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号

文章目录 巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号1 问题描述2 解决方案3 具体步骤4 效果测试5 小结与复盘 巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号 1 问题描述 不知各位是否也为复制过来的文本中夹杂的回车换行符抓狂过&#xff1f;就是在复…

Spring Boot知识管理:提升信息检索效率

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

ubuntu下route命令详解

buntu下route命令详解 1、显示路由表 route -n2、临时路由设置&#xff0c;重启网卡失效#添加一条路由(发往192.168.62这个网段的全部要经过网关192.168.1.1)route add -net 192.168.62.0 netmask 255.255.255.0 gw 192.168.1.1#删除一条路由 删除的时候不用写网关route del …

extern “C“ 的作用、C++ 和 C 编译的不同、C++ 编译过程的五个主要阶段

在 C 中&#xff0c;如果需要从 C 语言导入函数或与 C 代码交互&#xff0c;需要使用 extern "C" 关键字。这是因为 C 和 C 在编译过程中的 符号命名机制&#xff08;即 "名称修饰" 或 "name mangling"&#xff09;不同。 1. extern "C&qu…

怎么把一段音频的人声和背景音乐分开?

在数字音频处理中&#xff0c;将一段音频中的人声和背景音乐分开是一个复杂但又常见的需求。这种技术广泛应用于音乐制作、影视后期、广告制作等多个领域。本文将为你详细解析如何通过不同的方法实现这一目标&#xff0c;帮助你更好地掌握音频分离技术。 一、音频分离的基本概念…

无人直播自动化回复客户咨询

我们插件是根据页面元素变动进行自动化操作的&#xff0c;想要实现网页版自动化&#xff0c;必须了解html以及dom结构&#xff0c;还有xpath定位方法。 各大直播后台页面结构不一样&#xff0c;所以要进行兼容处理&#xff0c;我们一个插件支持以下直播或客服平台 唯一客服浏…

数据结构与算法:栈与队列的高级应用

目录 3.1 栈的高级用法 3.2 队列的深度应用 3.3 栈与队列的综合应用 总结 数据结构与算法&#xff1a;栈与队列的高级应用 栈和队列是两种重要的线性数据结构&#xff0c;它们在计算机科学和工程的许多领域都有广泛的应用。从函数调用到表达式求值&#xff0c;再到任务调度…

c#的opcua客户端源码,支持用户名密码

在工作中遇到需要采集西门子机床的opcua和kepServer的opcua&#xff0c;找了一些网上的demo都不能都连接成功&#xff0c;好不容易找到一个两个都支持的c#opcua客户端源码&#xff0c;分享给大家。 软件界面如下 连接kepserver成功的界面 连接西门子opcua的界面 c#源码链接如下…

开关电源调制模式和工作模式

开关电源调制模式和工作模式 ‌‌开关电源定义开关电源分类‌单管DC/DC和、双管DC/DC和四管DC/DC的主要区别正激和反激 DCDCBUCK原理BOOST原理BUCK-BOOST原理异步整流和异步整流同步整流异步整流同步和异步整流区别同步和异步整流优缺点 DCDC调制模式PWM&#xff08;Pulse Widt…

C++ | Leetcode C++题解之第475题供暖器

题目&#xff1a; 题解&#xff1a; class Solution { public:int findRadius(vector<int>& houses, vector<int>& heaters) {sort(houses.begin(), houses.end());sort(heaters.begin(), heaters.end());int ans 0;for (int i 0, j 0; i < houses.…

轻松掌握TCP与UDP核心机制

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:网络编程TCP&#x1f649; &#x1f439;今日诗词:Best wishes&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收…

相机曝光的两种模式

相机的曝光模式 相机帧率和曝光时间的关系 相机的图像采集包括曝光(Exposure)和读出(Readout)两部分 曝光又分为非重叠(non-overlapped)曝光和重叠(overlapped)曝光两种 在非重叠(“non-overlapped”)模式中&#xff0c;每个图像采集的周期中&#xff0c;相机在下一个图像采集…

萝卜快跑:迈向全球,挑战与机遇并存

萝卜快跑&#xff1a;迈向全球&#xff0c;挑战与机遇并存 引言 萝卜快跑的崛起 萝卜快跑的优势 萝卜快跑面临的挑战 未来展望 引言 在当今科技飞速发展的时代&#xff0c;自动驾驶技术成为了全球瞩目的焦点。众多科技巨头纷纷投入大量资源&#xff0c;试图在这个新兴领域…

文件完整性监控:如何提高企业的数据安全性

企业网络庞大而复杂&#xff0c;需要处理大量关键业务数据&#xff0c;这些敏感文件在企业网络中不断传输&#xff0c;并由多个用户和实体存储、共享和访问。FIM 工具或具有 FIM 功能的 SIEM 解决方案使企业能够跟踪未经授权的文件更改、对敏感信息的恶意访问、数据篡改尝试和内…

FreeRTOS——空闲任务和钩子函数介绍

空闲任务 在前面的学习中我们提到&#xff0c;空闲任务会负责释放一些被删除任务的内存&#xff0c;在FreeRTOS中&#xff0c;用户分配的内存通常也是在空闲任务中释放的。空闲任务是一个特殊的任务&#xff0c;当没有其他任务需要运行时&#xff0c;系统将会调度空闲任务来执行…

硬盘格式化后能恢复数据吗?好用4款工具集锦

嘿&#xff0c;硬盘格式化后能恢复数据吗&#xff1f;咱们现在的生活&#xff0c;数据可是宝贝&#xff0c;这大家都清楚。学习用的资料、工作的文件&#xff0c;还有那些宝贵的照片、视频&#xff0c;统统都存硬盘里。万一硬盘不小心被格式化了&#xff0c;那感觉就像所有东西…

【GUI】使用 PySide6 开发图片左右切换软件

使用 PySide6 开发图片左右切换软件 前言 在现代软件开发中&#xff0c;使用 Python 开发跨平台的 GUI 应用程序变得非常普遍。今天&#xff0c;我们将使用 PySide6 来开发一个简单的图片浏览器&#xff0c;它可以实现图片左右切换的功能&#xff0c;并自适应按钮布局。本教程…