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

    标题: Rotate Array
    通过率: 18.4%
    难度: 简单

    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]

    Hint:
    Could you do it in-place with O(1) extra space?

    Credits:
    Special thanks to @Freezen for adding this problem and creating all test cases.

    第一种思路,k等于多少就循环多少次:意思是若k=3则所有元素向后移动三次,越界的则进行放在第一位操作,

    具体看代码:

     1 public class Solution {
     2     public void rotate(int[] nums, int k) {
     3         int length=nums.length;
     4         int value=0;
     5         for(int i=0;i<k;i++){
     6             value=nums[length-1];
     7             for(int j=nums.length-2;j>=0;j--){
     8                 nums[j+1]=nums[j];
     9             }
    10             nums[0]=value;
    11         }
    12     }
    13 }

    上述思路明显不是高效的,下面对数据进行分析,

    1.2.3.4.5

    当k=3时结果是3,4,5,1,2

    把结果逆序下 可以看出来是   2,1,5,4,3逆序结果与正序进行对比

    1,2,3,4,5

    2,1,5,4,3

    发现在k-1的位置前后都是逆序的,

    第二种分析。

    原数据逆序

    5,4,3,2,1

    3,4,5,1,2

    也是在k-1位置前后进行逆序,

    那么我只用对原数据做如下操作就可得到结果:

    1、原数据逆序

    2,k-1之前逆序

    3,k-1之后逆序

    直接看代码:

     1 public class Solution {
     2     public void rotate(int[] nums, int k) {
     3         int length=nums.length;
     4         k%=length;
     5         res(nums,0,length-1);
     6         res(nums,0,k-1);
     7         res(nums,k,length-1);
     8         
     9     }
    10     public void res(int []arraynum,int start,int end){
    11         while(start<=end){
    12             int temp=arraynum[start];
    13             arraynum[start]=arraynum[end];
    14             arraynum[end]=temp;
    15             start++;
    16             end--;
    17         }
    18     }
    19 }
  • 相关阅读:
    Vue基本使用和指令集
    node.js介绍和npm的使用
    Vue基础(ES6)
    rest-framework解析器,url控制,分页,响应器,渲染器,版本控制
    JAVA的线程
    Android的存储方式
    第一个应用:一键打电话
    Android系统版本、Platform版本、SDK版本、gradle修改
    将应用代码由eclipse导入Android studio的方法NDK-Build和Cmake两种方法(以android_serialport_api为例)
    Android组件--碎片(fragment)
  • 原文地址:https://www.cnblogs.com/pkuYang/p/4311331.html
Copyright © 2011-2022 走看看