两道数组有关的OJ练习题

news2024/12/26 1:52:07

系列文章目录

🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集:我的C语言进阶合集,期待你的点击!!!🌈🌈
🎉🎉我的数据结构与算法合集:数据结构与算法合集,点进去看看吧!!! 🎊🎊

文章目录

  • 系列文章目录
  • 前言
  • 一、消失的数字
    • 题目分析:
      • 方法 1
      • 方法 2
  • 二、轮转数组
    • 题目分析:
      • 方法 1
      • 方法 2
      • 方法 3
  • END


前言

各位博友,大家好!👋 今天为大家送上数组有关的OJ练习的总结🔍。


一、消失的数字

想要挑战一下的小伙伴们,快来点击下面的链接吧!🔗
让我们来看看,到底谁的方法更胜一筹,比拼一下智慧与创意,嘻嘻~ 😉🧠✨

消失的数字

题目分析:

数组 nums 包含从 0 到 n 的所有整数,但其中缺了一个。

方法1:可以使用异或操作符来解决

思路如下:
两个相同的数字进行异或(^),得到的结果是数字 0
数字 0 与其他数字异或(^),得到的是该数字本身。
我们可以先将该数组的所有数字进行异或,
再将【0,n】的数字和该数组的异或结果进行异或(^),
最终就能得到那个缺失的整数。
原因很简单,那个消失的数字就出现了一次,其他数字出现了两次,
当进行异或(^)时,其他数字出现了两次,异或得到的结果是数字 0
最终就是数字0 和消失的数字进行异或(^),
结果就是那个缺失的整数。

方法 2:可以使用相减的方法

参考 方法 1,可以先将该数组的所有数字进行相加,得到 sum1
再将【0,n】的数字进行相加,得到 sum2
最后返回 sum2 - sum1
原因很简单,那个消失的数字就出现了一次,其他数字出现了两次。
当进行相减时,那个消失的数字就是sum2 - sum1

方法 1

int missingNumber(int* nums, int numsSize) 
{
    int i = 0; // 定义循环变量 i ,用于遍历数组
    int ret = 0; // 定义返回值变量 ret ,用于存储异或结果

    // 将该数组的所有数字进行异或
    for(i = 0; i < numsSize; ++i) 
    {
        ret ^= nums[i]; // 异或操作,将数组中的每个元素与 ret 进行异或
    }

    // 将【0,n】的数字和该数组的异或结果 ret 进行异或
    // 这里的 n 是数组的长度 numsSize
    for(i = 0; i <= numsSize; ++i) 
    {
        ret ^= i; // 将 0 到 numsSize 的每个数字与 ret 进行异或
    }

    return ret; // 返回最终的异或结果,即为缺失的数字
}

方法 1 的 时间复杂度是O(numsSize), 空间复杂度是O(1)

方法 2

int missingNumber(int* nums, int numsSize) 
{
    int i = 0; 		// 定义循环变量 i,用于遍历数组
    int sum1 = 0; 	// 定义变量 sum1,用于存储数组中所有数字的和
    int sum2 = 0; 	// 定义变量 sum2,用于存储从 0 到 numsSize 所有数字的和

    // 将该数组的所有数字进行相加,得到 sum1
    for(i = 0; i < numsSize; ++i) 
    {
        sum1 += nums[i]; // 累加数组中的每个元素
    }

    // 再将【0,n】的数字进行相加,得到 sum2
    // 这里的 n 是数组的长度 numsSize
    for(i = 0; i <= numsSize; ++i) 
    {
        sum2 += i; // 累加从 0 到 numsSize 的每个数字
    }

    return (sum2 - sum1); // 返回 sum2 和 sum1 的差值,即为缺失的数字
}

方法 2 的 时间复杂度是O(numsSize), 空间复杂度是O(1)

二、轮转数组

下面是这道题目的链接🔗,想尝试的博友,可以点击下面的链接直达哦 👋🏼

轮转数组

题目分析:

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

首先,要将 k % 数组的长度(numsSize)。
因为,第 k 次轮转其实就是第 0 次轮转。

方法 1

可以先将最右边(末尾)的那个元素保存起来,
再将前 n - 1 个元素向后移动一个位置,
上面是循环的一次,如此循环,一直到 k 次,最终就能得到轮转后的结果。

但是该方法超出了时间限制(即当有一个数组长度比较大的,通过时间要很长)。

方法 2

可以将数组的后面 k 个元素保存到一个新的数组中,
再将原来数组的前面 n - k 个元素尾插到新数组中。
最后将 新数组中的所有值 依次赋值给 原来的数组。

但是该方法也是超出了时间限制。

方法 3

是比较难想到的方法,
该方法是先将数组的后面 k 个元素进行逆序,
再将数组前面的 numsSize - k 个元素 进行逆序,
最后将该数组 整体 逆序。

// 交换数组中两个位置的元素的函数
void Swap(int* nums, int left, int right) 
{
    while(left < right) 
    {
        int tmp = nums[left]; 		// 临时变量,用于交换数值
        nums[left] = nums[right]; 	// 将 right 位置的值赋给 left 位置
        nums[right] = tmp; 			// 将临时变量的值(原 left 位置的值)赋给 right 位置

        ++left; 	// 移动 left  
        --right; 	// 移动 right  
    }
}

// 旋转数组的函数,将数组 nums 向右旋转 k 个位置
void rotate(int* nums, int numsSize, int k) 
{
    k %= numsSize; // 取模操作,确保 k 不超过数组长度,因为旋转数组长度圈数后会回到原样

    // 将最后 k 个元素 逆序
    Swap(nums, numsSize - k, numsSize - 1);
    // 将前 numsSize - k 个元素 逆序 
    Swap(nums, 0, numsSize - k - 1);
    // 将整个数组 逆序
    Swap(nums, 0, numsSize - 1);
}

方法 3 的 时间复杂度是O(numsSize), 空间复杂度是O(1)


END

每天都在学习的路上!
On The Way Of Learning

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

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

相关文章

clickhouse-题库

1、clickhouse介绍以及架构 clickhouse一个分布式列式存储数据库&#xff0c;主要用于在线分析查询 2、列式存储和行式存储有什么区别&#xff1f; 行式存储&#xff1a; 1&#xff09;、数据是按行存储的 2&#xff09;、没有建立索引的查询消耗很大的IO 3&#xff09;、建…

近实时”(NRT)搜索、倒排索引

近实时&#xff08;Near Real-Time, NRT&#xff09;搜索 近实时&#xff08;NRT&#xff09;搜索是 Elasticsearch 的核心特性之一&#xff0c;指的是数据在被写入到系统后&#xff0c;可以几乎立即被搜索和查询到。虽然它不像传统数据库那样完全实时&#xff0c;但它的延迟通…

springboot477基于vue技术的农业设备租赁系统(论文+源码)_kaic

摘 要 使用旧方法对农业设备租赁系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在农业设备租赁系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的农…

vue2 升级为 vite 打包

VUE2 中使用 Webpack 打包、开发&#xff0c;每次打包时间太久&#xff0c;尤其是在开发的过程中&#xff0c;本文记录一下 VUE2 升级Vite 步骤。 安装 Vue2 Vite 依赖 dev 依赖 vitejs/plugin-vue2": "^2.3.3 vitejs/plugin-vue2-jsx": "^1.1.1 vite&…

【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)

一、公共样式类属性 ArkUI框架提供的基础组件直接或者间接的继承自 CommonMethod &#xff0c; CommonMethod 中定义的属性样式属于公共样式。下面就来学习这些样式 1.1.尺寸设置 宽高设置 设置组件的宽高&#xff0c;缺省时使用组件自身内容的宽高&#xff0c;比如充满父布…

数据库系统原理:数据库安全性与权限控制

2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…

SQL语句整理五-StarRocks

文章目录 查看版本号&#xff1a;SPLIT&#xff1a;insert 和 update 结合 select&#xff1a;报错&#xff1a;1064 - StarRocks planner use long time 3000 ms in memo phase&#xff1a;字段增删改&#xff1a; 查看版本号&#xff1a; select current_version(); current…

Uniapp 手机基座调试App 打包成Apk文件,并上传到应用商店

1.Uniapp手机基座调试App。 1.1 以下是我另一篇文章 讲解 uniapp连接手机基座调试App、 Hbuildx使用SUB运行到手机基座测试_hbuilder基座-CSDN博客 2.打包本地的uniapp项目为apk文件。 打包的方式有很多种&#xff0c;我们可以选择本地打包和远程云端打包两种方式。 我们在打包…

UEFI 多任务

一般而言&#xff0c;UEFI 的主要作用是检测和初始化设备&#xff0c;加载操作系统的引导程序&#xff0c;然后将控制权交给操作系统&#xff0c;整个过程不需要大量的运算&#xff0c;在单个 CPU 核上运行单线程程序已经可以满足需求&#xff0c;因此&#xff0c;EDK2 没有提供…

人工智能与物联网:从智慧家居到智能城市的未来蓝图

引言&#xff1a;未来已来&#xff0c;智能化的世界 想象一下&#xff0c;一个早晨&#xff0c;智能闹钟根据你的睡眠状态自动调整叫醒时间&#xff0c;咖啡机早已备好热腾腾的咖啡&#xff0c;窗帘缓缓拉开&#xff0c;迎接清晨的阳光。这不是科幻小说中的场景&#xff0c;而是…

【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity

文章目录 前言**游戏引擎是什么&#xff1f;****游戏引擎对于我们的意义**1、**降低游戏开发的门槛**2、**提升游戏开发效率** **以前做游戏****现在做游戏****主流的游戏引擎有哪些&#xff1f;**Unity 相比其他游戏引擎的优势&#xff1f;**为什么选择Unity&#xff1f;**Uni…

Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总

问题1&#xff1a;打包的过程中不断提示 &#xff1a;codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决&#xff1a;打开钥匙串&#xff0c;点击证书---显示简介---信任----改为始终信任 &#xff08;记住 &#xff1a;不能只修改钥匙的显示简介的…

RabbitMQ中的Topic模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;支持多种消息传递模式&#xff0c;其中 Topic 模式 是一种灵活且强大的模式&#xff0c;允许生产者…

OpenEuler 22.03 安装 flink-1.17.2 集群

零&#xff1a;规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器&#xff0c;用于搭建 flink 集群。这里使用flink1.17.2 的原因&#xff0c;是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…

国标GB28181公网直播EasyGBS与国标GB28181协议融合,助力应急救援指挥无线视频监控系统建设

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一转变过程中&#xff0c;国标GB28181协议以其强大的功能和广泛的应用场景&#xff0c;成为了公共安全视频监控联网系统的核心标准。 应急救援指挥系统要求能够迅速响应各…

VisionPro开发使用交互反馈系统(Affordance System)

XR Interaction Toolkit 提供了一个affordance system 可供性系统&#xff0c;使用户能够创建对交互状态的视觉和听觉反馈。一般的信息流从向Affordance State Provider场景中添加一个&#xff08;通常是可交互的&#xff09;并将其指向我们要监视其交互状态的可交互对象开始。…

SpringCloud 入门(4)—— 网关

上一篇&#xff1a;SpringCloud 入门&#xff08;3&#xff09;—— Nacos配置中心-CSDN博客 Spring Cloud Gateway 作为 Spring Cloud 生态系统的一部分&#xff0c;主要在微服务架构中充当 API 网关的角色。它提供了统一的入口点来处理所有的 HTTP 请求&#xff0c;并将这些请…

在linux系统的docker中安装GitLab

一、安装GitLab&#xff1a; 在安装了docker之后就是下载安装GitLab了&#xff0c;在linux系统中输入命令&#xff1a;docker search gitlab就可以看到很多项目&#xff0c;一般安装第一个&#xff0c;它是英文版的&#xff0c;如果英文不好可以安装twang2218/gitlab-ce-zh。 …

vscode打开下一个文件的时候上一个文件会关闭

解决方法&#xff1a; 你可以通过设置 workbench.editor.enablePreview 来控制在 VS Code 中打开文件时是否会关闭上一个文件。将其设置为 false 可以防止这种行为。 {"workbench.editor.enablePreview": false } 在设置编辑器中显示 "workbench.editor.enab…

PostgreSQL编译安装教程

下载安装 1.在家目录创建一个文件夹放下载安装包 mkdir softwarecd software 2.下载文件压缩包 wget https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz 3.解压 tar -xzvf postgresql-16.0.tar.gz 4.编译 在software/postgresql-16.0下 cd software…