配列javaを回転します

配列が与えられたら、配列の要素を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]
説明:

できるだけ多くの解決策を考えてください。この問題を解決するには、少なくとも3つの異なる方法があります。
スペースの複雑さがO(1)のインプレースアルゴリズムを使用する必要があります。

出典:LeetCode
リンク:https ://leetcode-cn.com/problems/rotate-array
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

アイデア:スペースO(1)O(k%len)を期待していなかったので、最初のk%lenビットの配列を保存し、1回トラバースすると、答えが得られます。公式スペースO(1)を投稿してください。
ps:2回フリップすることは、フリップしないことと同じです。

class Solution {
    
    
    public void rotate(int[] nums, int k) {
    
    
        //这个必须要取余一下,不然会报错
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }

    public void reverse(int[] nums, int start, int end) {
    
    
        while (start < end) {
    
    
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start += 1;
            end -= 1;
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_43824233/article/details/112355984