数组相关的面试OJ题

news2024/11/24 10:55:16

目录

1.移除元素

方法1【暴力求解】

方法2【双指针】

2.删除两个有序数组中的重复项

方法1【暴力求解】

方法2【双指针】

3.合并两个有序数组

方法1【暴力求解】

方法2【开辟新数组】---选择较小的尾插 

方法3【三指针】---选择较大的头插

4.有序数组的合并

方法1【暴力求解】 

方法2【三指针】


1.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

方法1【暴力求解】

  • 首先遍历数组一遍找到元素
  • 从后向前依次覆盖
  • 特别提醒:向前覆盖之后,循环变量一定要--,和数组元素个数也要--
  • 时间复杂度:O(N^2)
int removeElement(int* nums, int numsSize, int val)
{
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		if (nums[i] == val)
		{
			int j = i;
			while (j < numsSize)
			{
				nums[j] = nums[j + 1];
				j++;
			}
			numsSize--;
			i--;
		}
	}
	return numsSize;
}
//OJ上是错误的❌

 


方法2【双指针】

  • 使用两个 下标dst src 代表两个数组(心中想象)
  • 用一个 下标src 去遍历数组。
  • 如果不是val,就将元素赋值给dst
  • 如果是val,就src++ ,后面这个元素会被覆盖
  • 时间复杂度:O(N)
int removeElement(int* nums, int numsSize, int val)
{
    int src=0;
    int dst=0;
    while(src<numsSize)
    {
        if(nums[src] != val)
        {
            nums[dst++]=nums[src++];
        }
        else
        {
            src++;
        }
    }
    return dst;
}
//这里使用的是下标
//那指针呢?
//用辅助数组也可以,具体情况看题目要求

2.删除两个有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。
  • 非严格递增排列 == 非递减排列  !=  乱序排列

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为1,2。不需要考虑数组中超出新长度后面的元素。

方法1【暴力求解】


方法2【双指针】

  • 使用两个 下标dst src 代表两个数组(心中想象)
  • 用一个 下标src 去遍历数组。
  • 相等的时候,不把元素放入dst中,src++
  • 不相等,把元素放入dst中
  • 特别提醒:dst是下标,返回最后数组元素的时候需要+1
  • 思想:不相等的放到src里面,相等就dst++,这样达到一个把相等的值覆盖的作用。相等的时候才会拉开差距,才有无效位置可以覆盖。
  •  时间复杂度:O(N)
int removeDuplicates(int* nums, int numsSize)
{
    int dst=1;
    int src=0;
    while(dst<numsSize)
    {
        if(nums[src] != nums[dst])
        {
            src++;
            nums[src]=nums[dst];
            dst++;
        }
        else
        {
            dst++;
//为什么这里src++移动到需要覆盖的位置,因为dst和src还要比较
//可以想下三指针怎么搞!
        }
    }
    return src+1;//易错
}
//数据下标
//指针呢?
//三个指针?
//用辅助数组也可以但是没必要


3.合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

方法1【暴力求解】

  • 先合并在nums1
  • 再冒泡排序
  • 这个方法效率低下:排序最快的 快速排序时间复杂度O(nlogN)
  • 时间复杂度:O(N^2)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int i=0;
    for(i=0;i<n;i++)
    {
        nums1[m+i]=nums2[i];
    }

    //排序
    for(i=0;i<n+m;i++)
    {
        int j=0;
        for(j=0;j<n+m-1-i;j++)
        {
            if(nums1[j]>nums1[j+1])
            {
                int tmp=nums1[j];
                nums1[j]=nums1[j+1];
                nums1[j+1]=tmp;
            }
        }
    }

}

方法2【开辟新数组】---选择较小的尾插 

  • 变长数组或动态内存开辟的数组空间 


方法3【三指针】---选择较大的头插

  • 倒叙比较大小放置 
  • 时间复杂度 O(N)

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int p1=m-1;
    int p2=n-1;//下标和元素个数的关系
    int j=m+n-1;
    while(p2>=0&&p1>=0)
    {
        if(nums1[p1]<nums2[p2])
        {
            nums1[j--]=nums2[p2];
            p2--;
        }
        else//p1>p2
        {
            nums1[j--]=nums1[p1];
            p1--;
        }
    }
    while(p2>=0)
    {
        nums1[j--]=nums2[p2--];
    }
}

 【整个思路】:

【详解】:

【结束条件】:


4.有序数组的合并

描述:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:输入包含三行,
第一行:包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行:包含n个整数,用空格分隔。
第三行:包含m个整数,用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并

示例1
输入: 5 6
            1 3 7 9 22
            2 8 10 17 33 44
输出: 1 2 3 7 8 9 10 17 22 33 44 

大家还记得这个题目吗?在我们数组题目当中也是讲解过暴力求解的方法。这里我们可以使用三指针的方法自己写一写。

操作符&算数转换题_唐唐思的博客-CSDN博客


方法1【暴力求解】 


方法2【三指针】 


✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正! 

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

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

相关文章

ElasticSearch实战指南必知必会:安装中文分词器、ES-Python使用、高级查询实现位置坐标搜索以及打分机制

ElasticSearch实战指南必知必会&#xff1a;安装中文分词器、ES-Python使用、高级查询实现位置坐标搜索以及打分机制 1.ElasticSearch之-安装中文分词器 elasticsearch 提供了几个内置的分词器&#xff1a;standard analyzer(标准分词器)、simple analyzer(简单分词器)、whit…

C++动态内存检查工具 - AddressSanitizer

参考 https://www.qt.io/blog/2013/04/17/using-gccs-4-8-0-address-sanitizer-with-qt https://doc.qt.io/qt-6/qmake-variable-reference.html#qmake-lflags AddressSanitizer是gcc编译器套件的一部分(gcc版本 > 4.8)&#xff0c;只要在编译器调用中添加-fsanitizeaddre…

三维模型的顶层合并构建几个注意事项探讨

三维模型的顶层合并构建几个注意事项探讨 在进行倾斜摄影超大场景的三维模型的顶层合并构建时&#xff0c;有一些重要的注意事项需要考虑。本文将对这些注意事项进行分析和总结。 一、数据质量与准确性 数据质量是进行顶层合并的关键因素之一。在进行合并之前&#xff0c;需要…

同为科技(TOWE)自动断电倒计时定时桌面PDU插排

在每个家庭中&#xff0c;插排插座都是必不可少的电源设备。随着各种电器的普及应用和生活节奏的加快&#xff0c;人们对插排也有着多样化的需求&#xff0c;比如在插排中加入定时开关、自动断电、断电记忆、倒计时等等功能&#xff0c;让原本不支持智能家居的用电器秒变智能。…

UE5.0.3版本 像素流送 Pixel Streaming

目录 0 引言1 准备工作1.1 下载Node.js1.2 下载 PixelStreaming&#xff08;非必须&#xff09; 2 快速入门2.1 打包工程2.2 启动信令服务器2.3 启动工程2.4 打开网页 3 总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x…

Goby 漏洞发布|XXL-JOB accessToken 权限绕过漏洞

漏洞名称&#xff1a; XXL-JOB accessToken 权限绕过漏洞 English Name&#xff1a;XXL-JOB default accessToken Permission bypass Vulnerability CVSS core: 9.2 影响资产数&#xff1a; 18489 漏洞描述&#xff1a; XXL-JOB 是一款开源的分布式任务调度平台&#xff0…

Netty实战专栏 | Java网络编程深入解析

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Netty实战专栏 ✨特色专栏&#xff1a…

Matplotlib教程(非常详细)(第二部分)

接着上一部分Matplotlib教程&#xff08;非常详细&#xff09;&#xff08;第一部分&#xff09;接着描述。 十七、Matplotlib双轴图 在一些应用场景中&#xff0c;有时需要绘制两个 x 轴或两个 y 轴&#xff0c;这样可以更直观地显现图像&#xff0c;从而获取更有效的数据。…

学习Opencv(蝴蝶书/C++)——1. 前言 和 第1章.概述

文章目录 0.前言0.1 视觉库的发展&#xff08;计算优化&#xff09;0.2 MMX,IPP和Opencv0.3 书籍及配套代码0.4 阅读建议 1. 概述1.1 计算机视觉任务1.2 Opencv1.2.1 目标1.2.2 起源和发展 1.3 Opencv代码库1.3.1 基本信息1.3.2 整体架构 参考 0.前言 opencv的全名&#xff1a…

Java精品项目源码第60期糖尿病之家(代号V060)

Java精品项目源码第60期糖尿病之家(编号V60) 大家好&#xff0c;小辰今天给大家介绍一个糖尿病之家论坛交流系统&#xff0c;演示视频公众号&#xff08;小辰哥的Java&#xff09;对号查询观看即可 文章目录 Java精品项目源码第60期糖尿病之家(编号V60)难度指数&#xff08;中…

【再更新】多分式标注(船新版本)

这篇是 多分式标注 脚本工具的第二次更新。 原文章及第一次更新详情请点击链接 【ArcGIS 脚本工具】生成多分式标注 【更新】多分式标注 脚本工具 更新内容 1.优化标注显示&#xff1a;可对生成后的分式标注加阴影或背景&#xff0c;不影响标注的正常显示&#xff1b; 更新…

activitycompat.requestPermissions不弹出弹窗问题

今天使用动态请求权限&#xff0c;但是弹窗怎么样都弹不出来后来发现&#xff0c;把targetsdk降低就好了 改成

【2021集创赛】Risc-v杯一等奖:自适应噪声环境的超低功耗语音关键词识别系统

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;东南大学 队伍名称&#xff1a;Hey Siri 指导老师&#xff1a;刘波 参赛队员&#xff1a;钱俊逸、张人元、王梓羽 总决赛奖项&#xff1a;全国一等奖 摘要…

不可错过!9个提供高质量免扣PNG素材的网站推荐!

1) 即时设计 即时设计是一款专业的 UI 设计工具&#xff0c;其设计功能强大&#xff0c;同时也是一款具有海量优质图片的PNG素材网站。即时设计的图片素材均来自于 Unsplash&#xff0c;包括头像、动物、建筑、食物、风景等不同种类&#xff0c;图片清晰质量高&#xff0c;可以…

AI时代项目经理成长之道:ChatGPT让项目经理插上翅膀

AI时代项目管理新模式 一本专注于帮助项目经理在AI时代实现晋级、提高效率的图书。 100%提高管理效率&#xff1a;揭秘ChatGPT与项目管理高效融合的核心方法论和实践经验。 为什么要买这本书&#xff1f; AI不会取代你&#xff0c;会用AI的人将取代你 21世纪的核心竞争力就是…

VMware Workstation 17安装教程之创建普通用户

创建普通用户 Subscription Manager。它指的是红帽产品订阅服务&#xff0c;是红帽公司的一项收费服务&#xff0c;我们暂时不需要。 安装完毕后等待重启 安装后的收尾工作 接受红帽许可协议 返回到初始化界面&#xff0c;单击FINISH CONFIGURATION按钮进行确认后&#xff0…

人工智能AI 全栈体系(十一)

第一章 神经网络是如何实现的 这些神经网络越来越复杂&#xff0c;都是用BP算法求解。网络有些变化就可能需要重新推导&#xff0c;而在实验过程中可能会做很多尝试&#xff0c;这样每次都重新推导BP算法太麻烦了。 十、深度学习框架 现在有了很多深度学习框架&#xff0c;这…

利用Nginx负载均衡、动静分离特性部署前后端项目

目录 一、Nginx简介 1.1 Nginx是什么&#xff1f; 1.2 Nginx的作用 二、Nginx负载均衡 2.1 Nginx安装 2.2 Nginx搭载负载均衡 2.2.1 tomcat负载均衡 2.2.2 服务器的集群 三、前后端分离项目 3.1 前端项目导出 3.2 前端项目Linux部署 一、Nginx简介 1.1 Nginx是什么…

外接移动硬盘/U盘无法读写解决方案

一&#xff1a;问题描述 将常用的便携移动硬盘/U盘插入终端&#xff0c;终端无法读取移动硬盘/U盘&#xff0c;并出现“无法访问 介质受写入保护”或“拒绝访问”等报错信息。 二&#xff1a;解决方案 方案一&#xff1a;磁盘设置只读属性&#xff0c;清除磁盘只读属性。 操作…

UL1363跨境电商排插测试报告要提供哪些资料

排插UL1363测试项目及测试方法的介绍 1、漏电流测试 TVSS的样品应与标称电压连接。该测量表的输入阻抗等于1500ohm电阻的阻抗&#xff0c;该电阻旁接一个0.15μF的电容。该电阻放置在接地电源导体和可触及的金属零件之间或裹在外壳上的金属铜箔和插入插座的插头的接地接线柱之间…