代码随想录62——额外题目【数组】:189轮转数组、724寻找数组的中心下标、922按奇偶排序数组II

news2025/4/13 23:53:58

文章目录

  • 1.189轮转数组
    • 1.1.题目
    • 1.2.解答
  • 2.724寻找数组的中心下标
    • 2.1.题目
    • 2.2.解答
  • 3.922按奇偶排序数组II
    • 3.1.题目
    • 3.2.解答

1.189轮转数组

参考:代码随想录,189轮转数组;力扣题目链接

1.1.题目

在这里插入图片描述

1.2.解答

这道题目在字符串里其实很常见,我把字符串反转相关的题目列一下:

字符串:力扣541.反转字符串II、字符串:力扣151.翻转字符串里的单词、字符串:剑指Offer58-II.左旋转字符串

本题其实和字符串:剑指Offer58-II.左旋转字符串 就非常像了,剑指offer上左旋转,本题是右旋转。

注意题目要求是要求使用空间复杂度为 O(1) 的 原地 算法

原地左边旋转字符串

  • 反转区间为前n的子串
  • 反转区间为n到末尾的子串
  • 反转整个字符串

原地右边旋转字符串

  • 反转整个字符串
  • 反转区间为前k的子串
  • 反转区间为k到末尾的子串

需要注意的是,本题还有一个小陷阱,题目输入中,如果k大于nums.size了应该怎么办

其实移动到num.size()次数之后就相当于没有移动,所以直接执行k % nums.size()次数就行。

最后给出代码如下,注意是右旋转,所以要先旋转整个字符串,再旋转子串。

void rotate(vector<int> &nums, int k)
{
    k = k % nums.size();   // 防止k过大

    // 左移:先旋转子串,再旋转整个字符串;右移:先旋转子串,再旋转整个字符串
    reverse(nums.begin(), nums.end());          // 先旋转整个数组
    reverse(nums.begin(), nums.begin() + k);    // 在旋转前半部分
    reverse(nums.begin() + k, nums.end());  // 最后旋转后半部分
}

2.724寻找数组的中心下标

参考:代码随想录,724寻找数组的中心下标;力扣题目链接

2.1.题目

在这里插入图片描述

2.2.解答

首先注意不要把这道题目理解错了,其中说的左右相等的下标是不包括当前的数字的,而是不算当前数字,其左边的数字和右边的数字的和相等。

但是这道题目仍然非常简单:

  • 遍历一遍求出总和sum
  • 遍历第二遍求中心索引左半和leftSum
    同时根据sum和leftSum 计算中心索引右半和rightSum
    判断leftSum和rightSum是否相同

给出代码如下:

int pivotIndex(vector<int> &nums)
{
    // 1.统计和
    int sum = 0;
    for(const auto& num : nums)
        sum += num;
    
    int left_sum = 0;
    int right_sum = 0;
    // 2.遍历求左边的和 和 右边的和
    for(int i = 0; i < nums.size(); i++)
    {
        // 注意这个并不是真的left_sum,而是多加了nums[i]
        left_sum += nums[i];  
        // 所以这里right_sum就也要把nums[i]加上
        right_sum = sum - left_sum + nums[i];  
        if(left_sum == right_sum)
            return i;
    }

    // 运行到这里说明没找到,返回-1
    return -1;
}

注意:上述代码就是在计算过程中,遍历到当前的下标时,直接把左边的left_sum也加上了当前的nums[i],此时i右边的数字综合是sum - left_sum。但是由于我们的left_sum多加了nums[i],所以这里计算right_sum的时候也要多加nums[i],即right_sum = sum - left_sum + nums[i]。比如1 7 3 6 5 6的例子,便利到6的时候,左边和是11,但是此时left_sum = 17,因为多加了当前的6;此时右边和是11,所以也要多加上当前的6,结果也是17.

另外一个方法其实就是可以便利到当前数字之后,就从总和中减去当前的数字,然后再/2,看结果和左边的和是否相等。此时的代码如下:

int pivotIndex(vector<int> &nums)
{   
    // 1.计算总和
    int sum = 0;
    for(const auto& num : nums)
        sum += num;

    int left_sum = 0;   // 左边总和,不包括当前下标
    for(int i = 0; i < nums.size(); i++)
    {
        // 如果此时总和/2等于左边的和
        if(left_sum * 2 == sum - nums[i])   
            return i;
        else 
            left_sum += nums[i];   // 否则累加当前数字,给下一次准备
    }

    // 运行到这里说明没找到,返回-1
    return -1;
}

3.922按奇偶排序数组II

参考:代码随想录,922按奇偶排序数组II;力扣题目链接

3.1.题目

在这里插入图片描述

3.2.解答

这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素,这样的的时间复杂度是O(n^2)。

但是其实可以换一个角度想,建立一个结果数组,分别分成奇数索引的空位和偶数索引的空位。然后遍历原数组中的元素,如果是奇数,那么就填到奇数空位中;如果是偶数,就填到偶数索引的空位中,这样就很简单了。

直接给出代码如下:

vector<int> sortArrayByParityII(vector<int> &nums)
{
    vector<int> result(nums.size(), 0);   // 先构造存储结果的数组
    int odd_idx = 1;   // 初始化奇数和偶数索引
    int even_idx = 0;   

    for(const auto& num : nums)
    {
        if(num % 2 == 0)   // 偶数
        {
            result[even_idx] = num;
            even_idx += 2;
        }
        else   // 奇数
        {
            result[odd_idx] = num;
            odd_idx += 2;
        }
    }

    return result;
}

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

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

相关文章

2022债市波动分析

2022债市波动分析 – 潘登同学的宏观经济分析框架 文章目录2022债市波动分析 -- 潘登同学的宏观经济分析框架波动事实波动原因人民币贬值压力811汇改前后经济稳中向好债市去杠杆债券市场的未来总结波动事实 2022年11月14日&#xff0c;反映债券价格的“中债总净价指数”单日下…

振弦采集模块使用流程

振弦采集模块使用流程 本章主要内容为 VM 模块基本工作原理以及工作参数、实时数据解释说明。 模块出厂时的默认参数值能够满足大部分振弦传感器的数据读取&#xff0c; 无特殊情况不需要修改参数。若需要修改某些参数时&#xff0c; 务必详细阅读本章内容以便参数含义。 错误…

改进粒子群算法求解电力系统经济调度问题(Matlab实现)

目录 1 相关知识点 2 Matlab完整代码实现 3 结果及可视化 1 相关知识点 这里总结一位博主的目录&#xff1a;梳理如下&#xff1a; 粒子群算法&#xff08;带约束处理&#xff09;——Python&Matlab实现 智能优化算法——粒子群算法&#xff08;Matlab实现&#xff09…

Docker概述及CentOS安装Docker

目录 一、Docker概述 Docker与虚拟机的差异 镜像和容器 Docker和DockerHub Docker架构 二、CentOS安装Docker 安装docker 卸载docker 启动docker 配置镜像加速 一、Docker概述 Docker 是一个用于开发、交付和运行应用程序的开放平台。 Docker 使您能够将应用程序与基…

国产软件厂商如何获得持久的竞争力和可持续增长?

近年来&#xff0c;美国对中国信息技术产业的制裁力度不断加大&#xff0c;华为等数百家中国高科技企业受波及而影响业务。加大自主研发力度&#xff0c;在芯片、操作系统、数据库、软件等卡脖子的关键技术领域&#xff0c;实现自主安全可控&#xff0c;成为中国信息科技产业发…

SpringMVC:拦截器+文件上传下载, 拦截器

一。比较常用&#xff08;理解思路&#xff09; 过滤器 和 拦截器 均体现了AOP的编程思想&#xff0c;都可以实现诸如日志记录、登录鉴权等功能&#xff0c;但二者的不同点也是比较多的&#xff0c;接下来一一说明。 拦截器&#xff1a;看做是多个Controller中公用的功能&…

【Linux】文件描述符

目录&#x1f308;前言&#x1f337;1、文件的概念&#x1f339;2、文件操作&#xff08;C语言&#xff09;&#x1f361;2.1、概念基本打开关闭操作&#x1f362;2.2、文件的打开方式&#x1f363;2.3、文件的读写操作&#x1f364;2.4、对系统调用的封装&#x1f338;3、系统…

python 另一种将内容写入记事本的方式

目录 问题描述&#xff1a; 方案一 &#xff08;常见的写法&#xff09;&#xff1a; 方案二&#xff1a; 问题描述&#xff1a; 如下图所示&#xff0c;欲将下图内容写入一个.txt 方案一 &#xff08;常见的写法&#xff09;&#xff1a; 使用f.write()函数&#xff0c; 如…

如何使用CompletableFuture

目录 一、CompletableFuture是什么 二、CompletableFuture用法 2.1、创建CompletableFuture 2.1.1、直接创建 2.1.2、创建一个使用指定数据作为结果的已结束的CompletableFuture 2.1.3、通过执行异步任务获取CompletableFuture 2.2、获取任务结果 2.3、消费结果 2.3.1、…

云原生技术中台 CNStack2.0 正式发布

作者&#xff1a;奥陌 11 月 5 日&#xff0c;在 2022 杭州 云栖大会上&#xff0c;云原生技术中台 CNStack2.0 正式发布。 阿里巴巴资深技术专家 谢吉宝介绍 CNStack2.0 企业在数字化转型的过程中&#xff0c;一部分问题得到了解决&#xff0c;但随着 IT 水平的不断提升&am…

【Milvus的人脸检索】

0. 介绍 在上一篇文章中&#xff0c;介绍了milvus提供的以图搜图的样例&#xff0c;这篇文章就在以图搜图样例的基础上进行修改&#xff0c;实现人脸检索。 常见的人脸任务&#xff0c;分为人脸检测、人脸识别、人脸对比和人脸检索&#xff0c;其中人脸检索的含义是&#xff…

点成分享 | 蛋白质浓度测定之考马斯亮蓝(Bradford)法

蛋白质是组成生物细胞、组织的重要成分&#xff0c;生物的所有生命活动都离不开蛋白质的参与。蛋白质是生命的物质基础&#xff0c;是构成细胞的基本有机物&#xff0c;是生命活动的主要承担者。生物材料中蛋白质含量的测定是生物学研究中最重要也是最基本的实验操作之一&#…

【微机接口】串行通信基础

计算机通信:CPU与外部的信息交换 并行通信&#xff1a;数据所有位同时被传输 串行通信&#xff1a;数据被逐位顺序传送 串行通信类型&#xff1a; 串行异步通信&#xff1a;一个字符用起始位和停止位来完成收发同步。 串行同步通信&#xff1a;采用同步字符来完成收发双方同…

营丘福稻品牌山东大米 国稻种芯·中国水稻节:淄博高青招牌

营丘福稻品牌山东大米 国稻种芯中国水稻节&#xff1a;淄博高青招牌 淄博市广播电视台新生活 大众网海报新闻记者 董玉歌 淄博报道) 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健…

【电源专题】案例:电源芯片规格书大标题写5A那是能输出5A吗?

这个案例是找到了问题点后再去审查规格书发现规格书里竟然有写明!只是最初始不是我导入的芯片就是了(其实就算是我导入的,以前也没有测试方法和手段能发现异常),而且这个芯片已经用了好久好久了,现在都停产了,买不到了。 从下图所示的规格书大标题中可以看到同步升压芯片…

苹果Mac电脑L2TP连接公司内部网络失败解决方案

苹果Mac电脑L2TP连接公司内部网络 苹果Mac系统在创建VPN连接时&#xff0c;一直提示&#xff1a;L2TP-VPN服务器没有响应。请尝试重新连接。如果仍然有问题&#xff0c;请验证你的设置并与管理员联系。 我们在添加VPN的时候需要填写机器认证中的共享秘钥&#xff0c;我这里填…

详解容灾恢复过程中跨数据中心级的关键故障切换

【摘要】容灾设计过程当中需要考虑的故障切换的场景有很多,数据中心内部的高可用切换不在本次讨论范围之内,我们讨论的是容灾恢复过程中的关键跨数据中心级的故障切换场景,从网络层到存储层都会涉及到。(文中涉及相关技术产品参数请以官网最新发布为准) 1. 容灾设计需要进…

c++异常处理

目录 1.c异常的由来 2.怎么使用异常来解决问题 3.异常安全 4.异常规范 5.异常处理的优缺点 1.c异常的由来 在c语言中&#xff0c;如果程序出现了错误&#xff0c;采用的是返回错误码的方式。最常见的&#xff1a; int main() {return 0; } 这里的return 0的0就是表示返…

Kubernetes学习(一)入门及集群搭建

一、简介 1.简介 Kubernetes 最初源于谷歌内部的Borg&#xff0c;Kubernetes 是一个全新的基于容器技术的分布式架构解决方案。 包含几个基本功能&#xff1a; 1.将应用水平扩容到多个集群 2.为扩容的实例提供负载均衡策略 3.提供基本的健康检查和自愈能力 4.实现任务的…

电机无位置控制方法研究

无位置控制方法研究 1.无位置控制技术研究现状 2.反电动势过零检测法 3.反电动势三次谐波积分检测法 4.续流二极管法 5.磁链法 6.扩展卡尔曼滤波算法&#xff08;EKF&#xff09; 7.基于扩展卡尔曼滤波算法&#xff08;EKF&#xff09;的转速及位置估算 8.电感测量法 9.涡流效…