数组反转

Posted hujianglang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组反转相关的知识,希望对你有一定的参考价值。

题目描述
给定一个数组,将数组中的元素向右移动 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]

#include <vector>
//要先实现一个数组反转可以通过三次反转实现
//references:https://blog.csdn.net/qq_28584889/article/details/83655019?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

class Solution{
public:
    //数组反转
    void reverseArray(vector<int>& array, int begin, int end){
        int temp,tmp_end = end;
        for(int i = begin; i <= (begin+end)/2; i++){
            temp = array[i];
            array[i] = array[tmp_end];
            array[tmp_end] = temp;
            tmp_end--;
        }
    }

    void rotate(vector<int>& nums, int k){
        int len = nums.size();
        k %= len;
        if(k == 0)
            return;
        reverseArray(nums,0,len-k-1);
        reverseArray(nums,len-k,len-1);
        reverseArray(nums,0,len-1);
        //C++自带的反转函数
//        reverse(nums.begin(),nums.end()-k);
//        reverse(nums.end()-k,nums.end());
//        reverse(nums.begin(),nums.end());
    }
};

//Solution2:
void reverseArray(int nums[],int start, int end){
    int temp;
    while(start < end){
        temp = nums[start];
        nums[start++] = nums[end];
        nums[end--] = temp;
    }
}

void rotate(int nums[], int n, int k){
    k%=n;
    if(k<=0) return;
    reverseArray(nums,n-k,n-1);
    reverseArray(nums,0,n-k-1);
    reverseArray(nums,0,n-1);
}

  

以上是关于数组反转的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

如何在 BackStack 上反转片段动画?

关于代码片段的时间复杂度

2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段

C语言反转单向链表的代码

VSCode自定义代码片段—— 数组的响应式方法