【LeetCode】【数组】【左/右旋转数组reverse “----->-->“ we can get “<--<-----“】

这篇博客介绍了如何解决编程问题中的旋转数组任务,包括使用辅助数组、翻转数组和环状替代三种方法,并通过具体的代码实现进行了解析。同时,文章提到了这个问题与字符串翻转的相似性,并提供了相关字符串翻转题目的链接作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

189. 旋转数组

三种解题思路

思路1:使用辅助数组


class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        vector<int> res(nums.size(),0);//辅助数组
        for(int i = 0;i<nums.size();i++){
            res[(k+i)%nums.size()] = nums[i];//这个地方卡了好久,请一定画图理解
        }
        for(int i = 0;i<nums.size();i++){
            nums[i]=res[i];
        }
    }
};

思路2:翻转数组

/*
nums = “----->–>”; k =3 // 后移3位
result = “–>----->”; // 要求的结果
reverse “----->–>” we can get “<–<-----” // 首先全部翻转
reverse “<–” we can get “–><-----” // 仅翻转前半部分
reverse “<-----” we can get “–>----->” // 然后翻转后半部分
this visualization help me figure it out 😃 // 形象化的方法帮你搞清楚

*/


class Solution {
public:
    void reverse(vector<int>& nums,int l,int r){
        while(l<r){
            swap(nums[l++],nums[r--]);
        }
    }
    void rotate(vector<int>& nums, int k) {
        k%=nums.size();
        reverse(nums,0,nums.size()-1);
        reverse(nums,0,k-1);
        reverse(nums,k,nums.size()-1);
    }
};

这道题目在字符串里其实很常见,我把字符串反转相关的题目列一下:

字符串:力扣541.反转字符串II
字符串:力扣151.翻转字符串里的单词
字符串:剑指Offer58-II.左旋转字符串

本题其实和字符串:剑指Offer58-II.左旋转字符串就非常像了,剑指offer上左旋转,本题是右旋转。

在字符串:剑指Offer58-II.左旋转字符串中,我们提到,如下步骤就可以左旋转字符串:
/*
nums = “–>----->”; k =3 // 左移3位
result = “----->–>”; // 要求的结果
reverse “–>” we can get “<–” // 仅翻转前半部分
reverse “----->” we can get “<-----” // 然后翻转后半部分
reverse “<–<-----” we can get “----->–>” // 全部翻转
this visualization help me figure it out 😃 // 形象化的方法帮你搞清楚

*/
反转区间为前n的子串
反转区间为n到末尾的子串
反转整个字符串

本题是右旋转,其实就是反转的顺序改动一下,优先反转整个字符串,步骤如下:
反转整个字符串
反转区间为前k的子串
反转区间为k到末尾的子串
【不改动也可以,搞清楚位置就好】
/*
nums = “–>----->”; k =3 // 左移3位
result = “----->–>”; // 要求的结果
reverse"–>----->"we can get’’<-----<–’’// 全部翻转
reverse “<-----” we can get “----->” // 然后翻转前半部分 【注意】0,s.size()-n-1
reverse “<–” we can get “–>” // 翻转后半部分 【注意】s.size()-n,s.size()-1

*/

class Solution {
public:
    string reverse(string &s,int l ,int r){
        while(l<r){
            swap(s[l],s[r]);
            l++;r--;
        }
        return s;
    }
    string reverseLeftWords(string s, int n) {
        n = n%s.size();
        reverse(s,0,s.size()-1);
        reverse(s,0,s.size()-n-1);
        reverse(s,s.size()-n,s.size()-1);
        return s;
    }
};

思路3.环状替代

详细思路
有点list的感觉,复习list的时候再回来看看这题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值