题解 | #旋转数组#

旋转数组

http://www.nowcoder.com/practice/e19927a8fd5d477794dac67096862042

1、算法思路

这道题我们使用额外数组可以轻易做出,但是题目要求不允许使用额外数组。
思路:循环右移相当于从第m个位置开始,左右两部分视作整体翻转。即abcdefg右移3位efgabcd 可以看成 AB 翻转成 BA(这里小写字母看成数组元素,大写字母看成整体)。既然是翻转我们可以用到reverse函数。

step1:因为m可能大于n,因此需要对n取余,因为每次长度为n的旋转数组相当于没有变化。
step2:第一次将整个数组翻转,得到数组的逆序,它已经满足了右移的整体出现在了左边。
step3:第二次就将左边的m个元素单独翻转,因为它虽然移到了左边,但是逆序了。
step4:第三次就将右边的n - m个元素单独翻转,因此这部分也正常了。

2、代码实现

class Solution {
public:
    /**
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型vector 给定数组
     * @return int整型vector
     */
    vector<int> solve(int n, int m, vector<int>& a) {
        //先取余
        m = m % n;
        //第一次翻转
        reverse(a.begin(), a.end());
        //第二次反转
        reverse(a.begin(), a.begin() + m);
        //第三次翻转
        reverse(a.begin() + m, a.end());
        return a;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:31
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
码农索隆:有点耳熟,你们是我教过最差的一届
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务