• 旋转数组 断舍离


    旋转数组
    给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

    示例 1:

    输入: nums = [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:

    输入:nums = [-1,-100,3,99], k = 2
    输出:[3,99,-1,-100]
    解释:
    向右轮转 1 步: [99,-1,-100,3]
    向右轮转 2 步: [3,99,-1,-100]
     

    提示:

    1 <= nums.length <= 105
    -231 <= nums[i] <= 231 - 1
    0 <= k <= 105
     

    进阶:

    尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
    你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

    作者:力扣 (LeetCode)
    链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    class Solution {
        public void rotate(int[] nums, int k) {
            if(k % nums.length == 0) {
                return;
            }
            if(k > nums.length) {
                k = k%nums.length;
            }
            int[] nums2 = new int[nums.length];
            for(int i = 0; i < nums.length; i++) {             
                int oldi = (nums.length-k+i) %nums.length;
                nums2[i] = nums[oldi];
            }
            for(int i = 0; i < nums.length; i++) {
                nums[i] = nums2[i];
            }
     
       
        }
    }
    -------------
     方法2:
     int[] rightpart = Arrays.copyOfRange(nums, nums.length - k, nums.length);
            System.arraycopy(nums, 0, nums, k, nums.length - k);
            System.arraycopy(rightpart, 0, nums, 0, k);
     
    ------------:-
    方法3:
     
    class Solution {
        public void rotate(int[] nums, int k) {
            if(k % nums.length == 0) {
                return;
            }
            if(k > nums.length) {
                k = k%nums.length;
            }   
             int hold = nums[0];
            int index = 0;
            int length = nums.length;
            boolean[] visited = new boolean[length];
            for (int i = 0; i < length; i++) {
                index = (index + k) % length;
                if (visited[index]) {
                    //如果访问过,再次访问的话,会出现原地打转的现象,
                    //不能再访问当前元素了,我们直接从他的下一个元素开始
                    index = (index + 1) % length;
                    hold = nums[index];
                    i--;
                } else {
                    //把当前值保存在下一个位置,保存之前要把下一个位置的
                    //值给记录下来
                    visited[index] = true;
                    int temp = nums[index];
                    nums[index] = hold;
                    hold = temp;
                }
            } 
        }
    }
    博客地址: https://www.cnblogs.com/java2sap/
    世界丰富多彩,知识天花乱坠。
    ---如果有帮到你,点个赞吧~
  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/java2java/p/15601472.html
Copyright © 2020-2023  润新知