力扣-刷题记录

news2024/11/16 21:52:49

189. 轮转数组

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

力扣icon-default.png?t=N2N8https://leetcode.cn/problems/rotate-array/description/

void rotate(int* nums, int numsSize, int k){
    if(k > numsSize)
    {
        k %= numsSize;
    }
    if(k==0){
         for(int i=0;i<numsSize;++i){
           nums[i]=nums[i];  
         }
    }
    int newArr[numsSize+k];
    int n=0;
    for(int i=0;i<numsSize;++i)
    {
        
        if(i+k<numsSize){
        newArr[i+k]=nums[i];
        }
        else
        {
            newArr[n]=nums[i];
            n++;
        }
    }
    for(int i=0;i<numsSize;++i)
    {
        nums[i]=newArr[i];
    }

}

虽然这段代码可以解决在k等于0时的问题,但是依然存在新创建数组和使用额外变量n的问题,可能会影响程序的性能和效率。在旋转次数不为0的情况下,仍需要创建新的数组,并且进行两次循环操作,比较耗费时间和空间。

因此,可以考虑使用其他的算法或优化方法来改进代码的实现方式,例如直接在原数组上进行旋转操作,不需要创建新数组,并且可以避免以上问题。

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

void rotate(int* nums, int numsSize, int k){
    //采用三趟倒置的做法
    if(k<numsSize)
    {
        k%=numsSize;
    }
    reverse(nums,0,numsSize-1);
    reverse(nums,0,k-1);
    reverse(nums,k,numsSize-1);
}

上述代码实现了数组元素的旋转操作,采用的是三次反转操作的方法。具体来说,对于给定的数组 nums,将其整个数组进行反转,然后将前 k 个元素进行反转,最后将剩余的元素进行反转,即可得到将数组旋转 k 步后的新数组。


面试题 17.04. 消失的数字

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

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

上述代码同样实现了在给定的数组 nums 中查找缺失的数字,并返回该数字。这个算法采用了数学方法计算序列中所有数字的和,然后减去数组 nums 中所有元素的和,差值就是缺失的数字。

具体来说,由于 nums 数组中缺失一个数字,因此整个序列的长度应该是 numsSize+1。假设整个序列包含从 0 到 numsSize 的所有整数,那么序列元素的总和为 (numsSize+1)*numsSize/2。因此,只需要遍历数组 nums,将 nums[i] 的值累加起来,然后用总和减去这个累加和,最终得到的就是缺失的数字。

int Num(int a)
{
    if (a <= 0)
    {
        return 0;
    }
    else
    {
        return a + Num(a - 1);
    }
}

int missingNumber(int* nums, int numsSize) {
    int b = Num(numsSize);
    int c = 0;
    for (int i = 0; i < numsSize; i++)
    {
       c =c + nums[i];
    }
    int d = b - c;
    return d;
}

上述代码同样实现了在给定的数组 nums 中查找缺失的数字,并返回该数字。与上一个算法不同的是,这个算法采用递归函数 Num 求出整数从 1 到 numsSize 的所有和 b,然后将数组 nums 中所有元素的值累加起来得到 c,最后用 b 减去 c 得到缺失的数字。

具体来说,递归函数 Num 的实现与第一段代码片段相同,但由于它的时间复杂度为 O(n),因此可能会在计算较大的 numsSize 时导致栈溢出或超时等问题。因此,这种算法的使用范围受到一定限制,仅适用于 numsSize 较小的情况。

总的时间复杂度为 O(n),空间复杂度为 O(1)。需要注意的是,在递归函数中调用自身时,每次调用都会创建新的函数栈帧,因此递归调用会占用一定的内存空间,可能会导致栈溢出等问题。


 3. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。

int reverse(int x){
    int rev=0;
    while(x!=0){
        if(rev<INT_MIN/10||rev>INT_MAX/10)
        {
            return 0;
        }
        int turn=x%10;
        x/=10;
        rev=rev*10+turn;
    }
    return rev;
}

该函数的目标是对给定的整数 x 进行反转,并将反转后的结果作为函数的返回值。在进行反转操作时,我们需要依次取出整数的每一位数字,然后将它们按照相反的顺序组成一个新的整数。例如,对于整数 123456,其反转结果应该为 654321。

具体来说,该函数的实现主要包含以下几个步骤:

初始化反转结果 rev 为 0,准备开始反转操作

int rev = 0;

进入一个 while 循环,循环条件为整数 x 不为 0。在每一次循环中,我们需要取出当前整数的最后一位数字,并将其追加到反转结果 rev 的末尾。

while (x != 0) {
    int turn = x % 10;          // 取出最后一位数字
    x /= 10;                    // 去掉最后一位数字
    rev = rev * 10 + turn;      // 将最后一位数字添加到反转结果 rev 的末尾
}

在更新反转结果 rev 前,需要判断当前的值是否超出了 int 类型的取值范围。如果超出,则直接返回 0,表示无法得到正确的反转结果。

if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {
    return 0;
}

这里的 INT_MIN 和 INT_MAX 分别表示 int 类型的最小值和最大值。如果反转结果 rev 除以 10 的结果小于 INT_MIN 或大于 INT_MAX,则说明反转结果已经超出了 int 类型的取值范围,无法得到正确的结果。

需要注意的是,在进行整数反转时,由于整数反转涉及数值溢出问题,因此需要特判反转结果的取值范围,以确保程序能够处理所有可能的情况。

循环结束后,返回反转结果 rev。

return rev;

如果输入整数为负数,则在反转前需要先去掉符号位,并在最后将反转结果添加上负号以得到正确的结果。

这一步可以通过在循环开始前增加以下代码实现:

bool negative = false;     // 标记整数是否为负数
if (x < 0) {
    negative = true;
    x = -x;                // 去掉符号位
}

在返回结果时,我们需要根据输入整数的符号,判断是否需要将反转结果添加上负号:

if (negative) {
    return -rev;
} else {
    return rev;
}

以上就是该函数的详细解释。总体来说,该函数的实现还是比较简单的,主要难点在于如何处理数字的反转和数值溢出问题。


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

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

相关文章

GlusterFS(GFS)分布式文件系统

目录 一.文件系统简介 1.文件系统的组成 2.文件系统的作用 3.文件系统的挂载使用 二.GlusterFS概述 1.GlusterFS是什么&#xff1f; 2.GlusterFS的特点 3.GlusterFS术语介绍 3.1 Brick&#xff08;存储块&#xff09; 3.2 Volume&#xff08;逻辑卷&#xff09; 3.3…

Qt Quick - 菜单综述

Qt Quick - 菜单综述使用总结一、概述二、菜单控件三、MenuBar 控件一、概述 菜单这一类&#xff0c;给我们提供了很多的便捷封住。 控件名功能Menu弹出式菜单&#xff0c;可以用作上下文菜单或弹出式菜单&#xff0c;也就是可以单独菜单上用&#xff0c;或者在鼠标右键&…

新能源汽车的充电、电池包的组成、充电的设备

一、新能源汽车的电池包 1、电动汽车电池包的组成 电动汽车的电池包主要由电池单体、模组构成。 电池单体指的是单个独立的锂电池&#xff0c;将多个电池单体组合在一起就成了模组&#xff0c;再把多个模组组合起来最终构成电池包。 不过这里有个特例&#xff0c;那就是比亚…

数据挖掘(2.4)--数据归约和变换

目录 1.数据归约 1.1数据立方体聚合 1.2特征选择 1.3数据压缩 1.4其他数据归约方法 回归分析 直方图 聚类 简单随机采样&#xff08;SAS&#xff09; 2.数据离散化 2.1基于信息增益的离散化 2.2基于卡方检验的离散化 2.3基于自然分区的离散化 3.概念层次生成 1.数…

3款免费好用的电脑录屏工具

案例&#xff1a;电脑录屏工具哪款免费又好用&#xff1f; “我想要挑选一款适合自己的好用的电脑录屏软件&#xff0c;但是我尝试了很多款录屏软件结果都不尽人意。免费版的软件功能少&#xff0c;录制效果差&#xff0c;想要高级功能需要付费解锁。想问问大家有没有免费好用…

如何搭建chatGPT4.0模型-国内如何用chatGPT4.0

国内如何用chatGPT4.0 在国内&#xff0c;目前可以通过以下途径使用 OpenAI 的 ChatGPT 4.0&#xff1a; 自己搭建模型&#xff1a;如果您具备一定的技术能力&#xff0c;可以通过下载预训练模型和相关的开发工具包&#xff0c;自行搭建 ChatGPT 4.0 模型。OpenAI提供了相关的…

day81【leetcode】打家劫舍专题

文章目录前言一、打家劫舍&#xff08;力扣198&#xff09;【相邻两间房不能偷】二、打家劫舍 II&#xff08;力扣213&#xff09;【围成一圈 相邻两间房不能偷】三、打家劫舍 III&#xff08;力扣337&#xff09;【树形DP】每日一题day81&#xff1a;链表中的下一个更大节点&a…

Java:jdk的安装以及hello world

由于本人头发较多&#xff0c;常常被认为是不用功的程序员&#xff1b;故&#xff0c;我来学学Java&#xff0c;希望我变秃了也变强了&#xff01; 首先是java的安装&#xff0c;根据我司java的建议&#xff0c;安装了jdk8与jdk17&#xff01;因为在众多的版本中&#xff0c;只…

3.7——静态成员

静态数据成员 静态成员&#xff0c;指的是在c类中声明成员时可以加上static关键字&#xff0c;这样声明的成员就叫做静态成员&#xff08;包括数据成员和成员函数&#xff09;。即声明为static的类成员或者成员函数便能在类的范围内同享。 说明&#xff1a; 1&#xff09;静态数…

WordGPT正式版4.0安装教程

下载 https://www.xsoftnet.com/share/a0004MZyPvB5k.html产品介绍&#xff1a; WordGPT正式版来了&#xff0c;V4.0震撼发布&#xff0c;兼容Office与WPS&#xff0c;集提纲生成、内容创作、文本补全、文章润色、归纳总结、自定义提示词、快捷排版为一体的多场景智能文案创作…

IT知识百科:什么是超融合数据中心网络?

超融合数据中心网络&#xff08;Hyper-Converged Data Center Network&#xff09;是一种基于软件定义网络&#xff08;SDN&#xff09;和虚拟化技术的新型数据中心网络架构。该架构将计算、存储和网络三大要素融合在一起&#xff0c;实现了网络、计算、存储资源的统一管理&…

HTML5 拖放

文章目录HTML5 拖放拖放浏览器支持HTML5 拖放实例设置元素为可拖放拖动什么 - ondragstart 和 setData()放到何处 - ondragover进行放置 - ondropHTML5 拖放 拖放&#xff08;Drag 和 drop&#xff09;是 HTML5 标准的组成部分。 拖放 拖放是一种常见的特性&#xff0c;即抓取…

没有两把刷子还敢来面试测试开发工程师?

目录 前言 1.对测试开发的理解 2.为什么做测试而不是去做开发 3.如何处理矛盾 4.职业发展 5.你认为测试人员需要具备哪些素质。&#xff08;你有哪些优点围绕这些来说&#xff09; 6.你为什么能够胜任这个岗位 7.测试方法 黑盒测试 白盒测试 8.测试的阶段 9.测试的类…

【ROS2指南-7】理解ROS2的Action

目标&#xff1a; 理解并学习ROS 2 中的Action通信方式。 教程级别&#xff1a;初学者 时间&#xff1a; 15分钟 内容 背景 先决条件 任务 1 设置 2 使用动作 3 ros2节点信息 4 ros2 动作列表 5 ros2 动作信息 6 ros2界面展示 7 ros2 动作 send_goal 概括 下一步 …

敏捷开发项目如何做好中长期规划

在一次与客户的方案交流中&#xff0c;我们的团队意识到研发软件产品和建造房屋是比较相似的工作&#xff0c;两者都是长期项目&#xff0c;需要多个团队相互协调&#xff0c;都会有验收方进行确认。并且在项目进行过程中&#xff0c;想法总是在变化&#xff0c;不断会有新的需…

易点易动固定资产管理系统如何解决固定资产管理中的个性化需求

随着企业规模的扩大和企业管理需求的多样化&#xff0c;固定资产管理已经成为企业日常运营的重要环节。然而&#xff0c;传统的固定资产管理方式在满足企业个性化需求方面表现出明显的不足。在这种背景下&#xff0c;易点易动固定资产管理系统应运而生&#xff0c;为企业提供了…

代码随想录Day51

今天继续学习动规解决相关问题。 337.打家劫舍||| 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有…

【RabbitMQ学习日记】—— 初识RabbitMQ

一、消息队列 1.1 MQ的相关概念 1.1.1 什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。…

MinIO从信息泄漏到RCE

文章目录信息泄露漏洞利用漏洞分析漏洞修复RCE漏洞分析参考文章信息泄露 漏洞利用 如果MinIO以集群方式部署&#xff0c;存在信息泄露漏洞&#xff0c;攻击者可以通过HTTP请求获取目标进程的所有环境变量&#xff0c;包括MINIO_SECRET_KEY和MINIO_ROOT_PASSWORD. vulhub有环…

paddle实现手写数字识别模型继续解读

要点&#xff1a; 手写数字识别用简单的线性进行分类效果比较差&#xff0c;添加卷积层和池化层效果会相对较好。参考文档&#xff1a;百度官方文档 一 网络结构 前几节我们尝试使用与房价预测相同的简单神经网络解决手写数字识别问题&#xff0c;但是效果并不理想。原因是手…