当前位置: 首页 > article >正文

轮转数组-三次逆置

题目

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

void rotate(int* nums, int numsSize, int k){}

示例:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

思路1

如示例所示般,一个一个地转。
先将数组最后一个元素储存到val,再将前numsSize-1个元素向后搬,最后把val的值赋给nums[0],就实现了最后一个元素放到数组开头。循环k次,就完成了轮转。

此方法效率较低,可能会超时。

void rotate(int* nums, int numsSize, int k) {
	//循环k次
    for (int i=0; i<k; i++)
    {
    	//数组最后一个元素储存到val
        int val = nums[numsSize-1];
        //前numsSize-1个元素向后搬
        for (int j=numsSize-1; j>0; j--)
        {
            nums[j] = nums[j-1];
        }
        //把val的值赋给nums[0]
        nums[0] = val;
    }
}

思路2

三次逆置
示例:
输入: nums = [1,2,3,4,5,6,7], k = 3
4 3 2 1 5 6 7 前numsSize-k个逆置
4 3 2 1 7 6 5 后k个逆置
5 6 7 1 2 3 4 整体逆置

void rotate(int* nums, int numsSize, int k){
	//k要小于numsSize
    k %= numsSize;
    //前numsSize-k个逆置
    for (int i=0; i<(numsSize-k)/2; i++)
    {
        int temp = nums[i];
        nums[i] = nums[numsSize-k-1-i];
        nums[numsSize-k-1-i] = temp;
    }
    //后k个逆置
    for (int i=0; i<k/2; i++)
    {
        int temp = nums[numsSize-k+i];
        nums[numsSize-k+i] = nums[numsSize-1-i];
        nums[numsSize-1-i] = temp;
    }
    //整体逆置
    for (int i=0; i<numsSize/2; i++)
    {
        int temp = nums[i];
        nums[i] = nums[numsSize-1-i];
        nums[numsSize-1-i] = temp;
    }
}

注:

  1. 次数k如果等于0,逆置0次为没有逆置,数组不变,没有运算的必要。
  2. k要小于musSize,会有k大于等于numsSize的情况。例如:nums={-1},k=2。如果k=numsSize的话,逆置结果为原来的数组,不变,没有计算的必要。使用求余%操作使得k的取值范围为0~numsSize-1。
  3. for循环里,循环条件里需要 /2,如果时下标0~numsSize的元素逆置,当i=0时,nums[0]和nums[numsSize-1]交换;当i=numsSize-1时,nums[numsSize-1]和nums[0]交换,交换两次,结果不变。

代码改进

将交换部分封装函数reverse

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)
{
    k %= numsSize;
    reverse(nums, 0, numsSize-k-1);
    reverse(nums, numsSize-k, numsSize-1);
    reverse(nums, 0, numsSize-1);
}

http://www.kler.cn/a/530669.html

相关文章:

  • openRv1126 AI算法部署实战之——TensorFlow TFLite Pytorch ONNX等模型转换实战
  • 新站如何快速获得搜索引擎收录?
  • MySQL5.5升级到MySQL5.7
  • python-leetcode-相同的树
  • 计算机网络一点事(24)
  • 芯片AI深度实战:给vim装上AI
  • Chromium132 编译指南 - Android 篇(六):从 Linux 版切换到 Android 版
  • 鸢尾花书《编程不难》02---学习书本里面的三个案例
  • 使用VCS进行单步调试的步骤
  • Scala语言的安全开发
  • Spring Bean 容器
  • 202周日复盘(159)本周回顾
  • Redis基础篇(万丈高楼平地起):核心底层数据结构
  • 『VUE』vue-quill-editor富文本编辑器添加按钮houver提示(详细图文注释)
  • 本地搭建deepseek-r1
  • 微软:FP4量化方法训练LLM
  • Jenkins 触发构建的几种常见方式
  • Kamailio 不通过 dmq 实现注册复制功能
  • 对比DeepSeek、ChatGPT和Kimi的学术写作中搜集参考文献能力
  • 独立开发浏览器插件:案例与启示
  • SQLGlot:用SQLGlot解析SQL
  • [ Spring ] Spring Boot Mybatis++ 2025
  • 二维前缀和
  • wxss样式模板,全局配置window
  • 模拟串口调试引入(Modbus Poll + Modbus Slave + VSPD)
  • 国产之DeepSeek认识、使用及影响