【初级算法】-- 4.数组元素位移

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

示例 1:
输入: [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]

示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

/**
 * 数组元素位移
 * @author 天赋吉运-杨晓慧
 * @create 2019-03-02 15:40
 */
public class rotate{

    public static void main(String[] args) {

        int[] nums={1,2,3,4,5,6,7};
        int[] ints = rotate_2(nums, 4);
        for (int i : ints) {
            System.out.println(i+",");
        } 
    }

    /**
     * 数组位移操作--利用双重循环来实现,时间复杂度O(kn),空间复杂度O(1)
     * @param nums 数组
     * @param k 移动的位数
     * @return 移动之后的数组
     */
  public static int[] rotate_1(int[] nums,int k){

     int n=nums.length;
     k %=n;   // 取余后得到真正需要位移的数量,作为外循环的次数

      for (int i = 0; i < k; i++) {
          int temp=nums[n-1]; //把最后一个元素拿出来存到临时变量内
          // 所有元素各自往后移一位,
          // 从倒数第二个开始移动,往后移一位;然后倒数第三个,依次下去……  这样第一个元素会被空出来
         for( int j=n-1; j>0; j--){
             nums[j]=nums[j-1];
          }
          // 临时变量里暂存的最后一个元素 现在可以放到第一个元素的位置了
          // 此时所有元素都往后位移了一位,需要移动k位,便执行k次外循环
          nums[0] =temp;
      }
        return nums;
  }


    /**
     * 数组位移操作,利用前后反转来实现
     * @param nums 数组
     * @param k 移动的位数
     * @return 移动之后的数组
     */
    public static int[] rotate_2(int[] nums, int k) {
        int n = nums.length;
        k %= n;   // 取余得到实际位移数
        //1. 先整个数组反转
        reverse(nums, 0, n - 1);
        //2. 位移数之前的部分反转
        reverse(nums, 0, k - 1);
        //3. 位移数之后的部分反转
        reverse(nums, k, n - 1);
        return nums;
    }


    /**
     * 将数组内从起始位到结束位之间的数字进行位置调换(前后反转)
     * @param nums 待反转的数组
     * @param start 起始
     * @param end 结束
     */
    private static void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start++] = nums[end];
            nums[end--] = temp;
        }
    }
}

输出的结果:
在这里插入图片描述

以上代码笔者已经过验证,读者阅后可以自行亲测,欢迎交流, 一起写高质量的代码。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页