自学内容网 自学内容网

轮转数组

思路:

1. 很暴力直接用取余的方式做。

        开一个新的数组。

class Solution {
    const int N = 1e5+10;
public:
    void rotate(vector<int>& nums, int k) {
        
        int n=nums.size();
        int a[nums.size()];
        for(int i=0;i<n;i++)
        {
            a[i]=nums[(i+(n<<3)-k)%n];
        }
        for(int i=0;i<nums.size();i++)
        {
            nums[i]=a[i];
        }
        
    }
};

法二:很巧妙的方法。

我们可以发现:

        当我们将数组的元素向右移动 k 次后,尾部 k mod n 个元素会移动至数组头部,其余元素向后移动 k mod n 个位置。

太妙了啊。实际上一个序列翻转两次就和原始序列相同,所以整体翻转一次 使得两部分序列的位置到位,然后各部分再翻转一次,他们各自就和原始序列的排列相同了


原文地址:https://blog.csdn.net/weixin_66692283/article/details/140623898

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!