zoukankan      html  css  js  c++  java
  • leetcode:Rotate Array

    Rotate an array of n elements to the right by k steps.

    For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

    Note:
    Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

    [show hint]

    Related problem: Reverse Words in a String II

    分析:题意为 将n个元素的数组向右旋转k步

    思路:用vector容器的东西来做很简单

    代码如下:(O(1) Space

    class Solution {
    public:
        void rotate(vector<int>& nums, int k) 
        {
            for(int i=0;i<k;i++)
            {
                nums.insert(nums.begin(), nums.back());
                nums.pop_back();
            }
        }
    };
    

    然后换种方法:

    class Solution {
    public:
        void rotate(vector<int>& nums, int k) {
            int n=nums.size();
            vector<int> v(n);
            for(int i=n-k,j=0;i<n-1,j<k-1;i++,j++){
                v[j]=nums[i];
            }
            for(int i=0,j=k;i<n-k-1,j<n-1;i++,j++){
                v[j]=nums[i];
            }
            nums=v;
        }
    };
    

    出错:Last executed input:[1,2,3,4,5,6], 11  

    因为没有考虑到当k大于n的情况,所以需要改进:

    class Solution {
    public:
        void rotate(vector<int>& nums, int k) {
            int n = nums.size();
            vector<int> rot(n);
            for(int i = 0; i < n; i++) {
                if((i + k) < n)  rot[i + k] = nums[i];
                if((i + k) >= n) {
                    rot[(i + k)%n] = nums[i];
                }
            }
            nums = rot;
        }
    };
    

    c语言

    看看:

     void rotate(int* nums, int numsSize, int k) {
        int i;
        if(k > numsSize)
        k -= numsSize;
        int* temp = (int*)calloc(sizeof(int), numsSize);
        for(i = 0; i < k; i++)
           temp[i] = nums[numsSize - k + i];
        for(; i < numsSize; i++)
           temp[i] = nums[i - k];
    
         for(i = 0; i < numsSize; i++)
           nums[i] = temp[i];
     }
    

     或:

    void reverse(int *nums, int start, int end) {
        int tmp;
        while (start < end) {
            tmp=nums[start];
            nums[start]=nums[end];
            nums[end]=tmp;
            ++start;
            --end;
        }
    }
    
    void rotate(int* nums, int numsSize, int k) {
        k=k%numsSize;
        if (k==0) return;
        reverse(nums,0,numsSize-k-1);
        reverse(nums,numsSize-k,numsSize-1);
        reverse(nums,0,numsSize-1);
    }  
    

      

     

      

     

  • 相关阅读:
    卫星时间同步装置的安装及售后
    windowsU盘重装系统:操作流程
    vue安装正确流程
    win10以太网未识别的网络
    [UnityShader]unity中2D Sprite显示阴影和接受阴影
    [UnityShader]说厌了的遮挡显示
    [Unity]利用Mesh绘制简单的可被遮挡,可以探测的攻击指示器
    ConcurrentHashMap源码解读
    Vector底层原理
    LinkedList集合底层原理
  • 原文地址:https://www.cnblogs.com/carsonzhu/p/4658520.html
Copyright © 2011-2022 走看看