数组OJ题汇总(一)

news2024/11/29 20:43:59

本专栏内容为:leetcode刷题专栏,记录了leetcode热门题目以及重难点题目的详细记录

💓博主csdn个人主页:小小unicorn
⏩专栏分类:Leetcode
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

数组OJ题汇总

  • 大纲:
  • 轮转数组
    • 解题思路:
      • 方法一:
      • 方法二:
        • 代码解决:
      • 方法三:
        • 代码解决:
  • 消失的数字
  • 解题思路:
      • 思路一:
      • 思路二:
        • 代码解决:
      • 思路三:
        • 代码解决:
  • 移除元素:
    • 解题思路:
      • 思路一:
      • 思路二:
        • 代码解决:
  • 删除有序数组的重复项:
    • 解题思路:
      • 代码解决:
  • 合并两个有序数组:
    • 解题思路:
      • 代码解决:

大纲:

在这里插入图片描述

轮转数组

题目来源:旋转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
在这里插入图片描述

解题思路:

方法一:

一个一个旋转,从K位置开始,将前面的数依次向后挪动。

在这里插入图片描述

方法二:

将后K个放到前面,然后将n-k个放到后面。
在这里插入图片描述

代码解决:
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);
    tmp=NULL;
}

方法三:

采取三段逆置,先将n-k个逆置,然后把后K个逆置,最后我们再整体逆置一次,就可达到目的。注意数组下标的把控。
在这里插入图片描述

代码解决:
void reverse(int*a,int left,int right)
{
      while(left<right)
      {
            int tmp=a[left];
            a[left]=a[right];
            a[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);
}

消失的数字

题目来源:面试题17.消失的数字

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
在这里插入图片描述

解题思路:

思路一:

排序+遍历。
在这里插入图片描述

思路二:

0+N等差数公式计算结果-数组中的值,就是消失的数字。
时间复杂度:O(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;
}

思路三:

单身狗思路:
异或。
在这里插入图片描述

代码解决:
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;
}

移除元素:

题目来源:27.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
在这里插入图片描述

解题思路:

思路一:

开辟一个新数组,将不等于val的值插入到新数组中。
在这里插入图片描述

思路二:

跟思路一一样,只是我们不用开辟新数组,直接在原数组中进行修改。

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

删除有序数组的重复项:

题目来源:26.删除有序数组的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
在这里插入图片描述

解题思路:

双指针法:
定义两个变量,可以错位可以不错位,只要ptr的值不等于val就赋值给dst。
在这里插入图片描述
在这里插入图片描述

代码解决:

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

      }
    return dst+1;
}

合并两个有序数组:

题目来源:88.合并两个有序数组

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

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

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

解题思路:

先理解一下,递增和非递减:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码解决:

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--];
     }
}

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

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

相关文章

MSQL系列(十) Mysql实战-Join驱动表和被驱动表区分

Mysql实战-Join驱动表和被驱动表区分 前面我们讲解了Mysql的查询连接Join的算法原理, 我发现大家都知道小表驱动大表,要让小表作为驱动表, 现在有2个问题 查询多表, 到底哪个是驱动表?哪个是被驱动表, 如何区分?索引如何优化,到底是加在驱动表上,还是被驱动表上? 今天我们…

[Leetcode] 0108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 题目描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a…

【Android内存优化】内存泄露优化之强引用变弱引用完全详解

内存泄露背景 什么是内存泄露 内存空间使用完毕后无法被释放的现象,对于还保持着引用, 该内存不能再被分配使用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们。 所以逻辑不再使用的对象,需要释放强引用,以便GC进行回收。 JVM 工作原理 JVM 垃圾回收原理,点…

vlc打开网络流(如rtmp),并查看媒体信息(如编码格式等编码信息)

打开vlc 选择媒体&#xff0c;打开网络串流 输入rtmp地址&#xff0c;点击播放 选择工具-编解码信息 可以查看节目的编码信息什么的

HBuilderX代码变量名称翻译插件

对于许多开发者而言&#xff0c;怎么规范的命名变量是一个非常痛苦的事&#xff0c;而在HBuilderX中有一个的插件可以快速的帮助你完成中文转带格式的变量名&#xff0c;格式可以选择小驼峰、大驼峰、下划线、常量、CSS类名等。 以下为添加此插件的步骤 1、打开插件安装 选择…

Android 类似淘宝的吸顶特效 NestedScrollView+RecycleView

运行图 布局的设计 要实现上面的效果需要搞定NestedScrollView和RecycleView的滑动冲突。有人要问RecycleView为何要滑动自动撑大不就好了么&#xff1f;这个问题其实对于有限的资源加载来说是很好的解决方案&#xff0c;但是如果涉及到的是图文结合的并且有大批量的数据的时候…

牛客题霸 -- HJ52 计算字符串的编辑距离

解题步骤&#xff1a; 参考代码&#xff1a; int main() {string s1;string s2;while (cin >> s1 >> s2){int ms1.size();int ns2.size();//增加空白字符&#xff0c;修正下标的映射关系s1 s1;s2 s2;//多卡一行&#xff0c;多开一列vector<vector<int&…

从零开始开发图床工具:使用 Gitee 和 Electron 实现上传、管理和分享

说在前面 平时写文章或写代码的时候&#xff0c;都少不了需要将本地图片转成在线图片链接&#xff0c;大家都是使用什么工具进行转换的呢&#xff1f;相信很多人都有自己的图床工具&#xff0c;今天来给大家介绍一下&#xff0c;怎么基于Gitee和Electron来开发一个便捷的图床工…

22、Python -- 创建对象和使用对象

目录 构造方法类的作用创建对象操作对象的实例变量操作对象的实例方法增加方法调用方法添加方法删除方法 方法与实例变量总结 构造方法 创建对象 操作实例变量 操作方法 构造方法 构造方法是一个特殊的实例方法&#xff0c;方法名为__init__ 创建对象时&#xff0c;自动调用构…

【手把手教vue会员管理系统】篇四之登录界面

一、登录界面路由配置 1.将view目录下的about、home组件删除&#xff0c;再新建login文件夹&#xff0c;在login文件夹下新建index.vue组件&#xff0c;并添加如下图所示的代码&#xff1a; 2.将App.vue更改成下图所示&#xff0c;删掉不必要的代码。 3.在router的index.js文件…

哈希算法:如何防止数据库中的用户信息被脱库?

文章来源于极客时间前google工程师−王争专栏。 2011年CSDN“脱库”事件&#xff0c;CSDN网站被黑客攻击&#xff0c;超过600万用户的注册邮箱和密码明文被泄露&#xff0c;很多网友对CSDN明文保存用户密码行为产生了不满。如果你是CSDN的一名工程师&#xff0c;你会如何存储用…

项目资源管理案例题

本文来自江山老师高项文档 规划资源管理 没有规划资源管理 资源管理计划项目经理一人制定&#xff0c;没有全员参与 资源管理计划内容不全面&#xff0c;有遗漏 质量工程师编写资源管理计划是不对的 资源管理计划应该各干系人参与&#xff0c;而且还需要经过评审 估算活…

基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a; 基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理_董雷 仿真平台&#xff1a; MATLABcplex 主要内容&#xff1a; 主要为多虚拟电厂/微网的优化调度策略&#xff0c;模型…

实用篇-Nacos配置管理

Nacos不仅具有注册中心的功能&#xff0c;还具有注册管理的功能 一、Nacos实现配置管理 可以使用统一配置管理&#xff0c;来配置更改热更新&#xff0c;整体结构如下 前提条件: 你已经把上面的 实用篇-Nacos注册中心 学完了&#xff0c;并且项目也跟着做了。我们下面会使用到…

Python 接口自动化 —— requests框架

1.前言 Python内置的urllib模块&#xff0c;也可以用于访问网络资源。但是&#xff0c;它用起来比较麻烦&#xff0c;而且&#xff0c;缺少很多实用的高级功能。因此我们使用 requests 模块进行进行接口测试。 requests官方文档资料地址&#xff1a;http://cn.python-request…

操作系统:进程与线程(二)同步与互斥B

一战成硕 2.3.5 管程2.3.6 经典同步问题 2.3.5 管程 管程的特性保证了进程互斥&#xff0c;无需程序员自己实现互斥&#xff0c;降低了死锁发生的可能。 管程的定义 管程是一种高级的同步机制。 定义描述举例 条件变量 2.3.6 经典同步问题 生产者消费者问题 缓冲区没满&a…

会说话,得天下!演讲与口才训练必修课

会说话&#xff0c;得天下&#xff01;演讲与口才训练必修课 口才是现代职场上一项非常重要的素质。有了好的口才&#xff0c;不仅可以很好地展示自己的思想和见解&#xff0c;还可以影响他人并获得支持&#xff0c;这对个人职业发展十分重要。所以&#xff0c;学习如何进行出…

详解 DES加密技术 | 凯撒密码 | 栅栏密码

目录 密码学 恺撒密码 栅栏密码 消息和加密 密码的三个特性 算法和密钥 对称算法 公开密钥算法 DES对称加密技术 DES算法的安全性 DES算法的原理 DES算法的实现步骤 IP置换表和IP-1逆置换表 函数f 子密钥ki S盒的工作原理 DES算法的应用误区 密码学 密码学是一门…

Oracle (7)Online Redo Log Files

目录 一、Oracle Online Redo Log Files及其相关内容介绍 1、Online Redo Log Files简介 2、Online Redo Log Files特点 3、Online Redo Log Files文件组 4、多路复用文件 5、联机重做日志文件工作方式 6、LGWR什么时候写重做 7、LS和LSN 8、删除Redo文件成员 9、删除…

【黑马程序员】mysql基础篇笔记

2023年10月26日12:21:09过一下 1.01.MySQL课程介绍(Av765670802,P1) 2.02. 基础-课程内容&数据库相关概念(Av765670802,P2) 3.03. 基础-概述-MySQL安装及启动(Av765670802,P3) 4.04. 基础-概述-数据模型(Av765670802,P4) 通过表来存储数据的数据库就叫做关系型数据库 …