zoukankan      html  css  js  c++  java
  • 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.

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

    算法

    代码一

     1 public void rotate(int[] nums, int k) {
     2         int n = nums.length;
     3         int temp;
     4         k = k % n;
     5         for (int i = 0; i < n / 2; i++) {
     6             temp = nums[i];
     7             nums[i] = nums[n - 1 - i];
     8             nums[n - 1 - i] = temp;
     9         }
    10         for (int i = 0; i < k / 2; i++) {
    11             temp = nums[i];
    12             nums[i] = nums[k - 1 - i];
    13             nums[k - 1 - i] = temp;
    14         }
    15         for (int i = 0; i < (n - k) / 2; i++) {
    16             temp = nums[k + i];
    17             nums[k + i] = nums[n - 1 - i];
    18             nums[n - 1 - i] = temp;
    19         }
    20     }

    注意k可能会比n大,所以将k模n。

    代码二

     1 public void rotate1(int[] nums,int k){
     2         int n=nums.length;
     3         k=k%n;
     4         reverse(nums,0,n-1);
     5         reverse(nums,0,k-1);
     6         reverse(nums,k,n-1);
     7     }
     8     private void reverse(int[] nums,int s,int e){
     9         int temp;
    10         while(s<e){
    11             temp=nums[s];
    12             nums[s]=nums[e];
    13             nums[e]=temp;
    14             s++;
    15             e--;
    16         }
    17     }
    18     private void reverse1(int[] nums,int m,int n){
    19         while(m<n){
    20             nums[m]^=nums[n];
    21             nums[n]^=nums[m];
    22             nums[m]^=nums[n];
    23             m++;
    24             n--;
    25         }
    26     }

    代码二的思想和代码一的思想一样,优点是把三次反转写成一个函数。另外两个值交换可以用异或运算。

    代码三

     1 //https://leetcode.com/discuss/28501/my-c-solution-o-n-time-%26%26-o-1-space
     2     public void rotate2(int[] nums, int k) {
     3         int n = nums.length;
     4         k = k % n;
     5         int i = 0;
     6         int nowIndex = 0, tmp1, tmp2 = nums[0];
     7         for (int j = 0; j < n; j++) {
     8             tmp1 = tmp2;
     9             nowIndex = (nowIndex + k) % n;
    10             tmp2 = nums[nowIndex];
    11             nums[nowIndex] = tmp1;
    12             if (nowIndex == i && i < n - 1) {
    13                 i++;
    14                 nowIndex = i;
    15                 tmp2 = nums[nowIndex];
    16             }
    17 
    18         }
    19     }
  • 相关阅读:
    谨慎的覆盖clone()方法
    siverlight 实现神奇罗盘
    Java读取一个目录(文件夹)下的文件例子
    关于 Web 字体:现状与未来
    logistic回归
    泸沽湖的介绍
    with grant option与with admin option区别
    sqlldr日期格式
    对List顺序,逆序,随机排列实例代码
    索引组织表(IOT)
  • 原文地址:https://www.cnblogs.com/qiaoshanzi/p/5032113.html
Copyright © 2011-2022 走看看