zoukankan      html  css  js  c++  java
  • 初级算法-3.旋转数组

    题目描述:

    给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数

    示例 :
    输入: [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.最简单的想法:每次右移一位,分k次完成。。但是,效率太低
    2.将数组进行三次翻转:例: 0 1 2 3 4,k=2
      第一次:翻转前length-k%length个元素   2 1 0 3 4
      第二次:在第一次的基础上翻转全部元素    4 3 0 1 2
      第三次:在第二次的基础上翻转前面k个元素 3 4 0 1 2

    代码:

     1 void rotate(int* nums, int numsSize, int k) {
     2     if(k<=0||numsSize<=1||k%numsSize==numsSize) return;
     3     int t;
     4     int i;
     5     int count=(numsSize-k%numsSize)/2;
     6     int end=numsSize-1-k%numsSize;
     7     //0 1 2 3 4
     8     
     9     for(i=0;i<count;i++)
    10     {
    11         t=nums[i];
    12         nums[i]=nums[end-i];
    13         nums[end-i]=t;
    14     }
    15     //2 1 0 3 4
    16     end=numsSize-1;
    17     for(i=0;i<numsSize/2;i++){
    18         t=nums[i];
    19         nums[i]=nums[end-i];
    20         nums[end-i]=t;
    21     }
    22     //4 3 0 1 2
    23     end=k%numsSize-1;
    24     for(i=0;i<k%numsSize/2;i++){
    25         t=nums[i];
    26         nums[i]=nums[end-i];
    27         nums[end-i]=t;
    28     }
    29     //3 4 0 1 2
    30         
    31 }
  • 相关阅读:
    设计模式
    设计模式
    设计模式
    JS | Reduce
    JS | 数组的深拷贝与浅拷贝
    JS | 数组操作
    Lodash | 指定路径对Object操作
    Git | 场景总结
    ES6 Class
    SpringBoot | Jpa @Id @GeneratedValue
  • 原文地址:https://www.cnblogs.com/hzhqiang/p/10738761.html
Copyright © 2011-2022 走看看