【C/C++】Rotate Array

实现数组旋转(循环右移)

如数组 [1, 2, 3, 4, 5, 6, 7],右移 3 位则为 [5, 6, 7, 1, 2, 3, 4]

首先使用泛型函数

void Rotate(void *front, void *middle, void *last) {
    int frontSize = (char *)middle - (char *)front;
    int backSize = (char *)last - (char *)middle;
    char *buffer = (char *)malloc(frontSize);
    memcpy(buffer, front, frontSize);
    memmove(front, middle, backSize);
    memcpy((char *)last - frontSize, buffer, frontSize);
    free(buffer);
}

分析:

1、由于 front、middle、last 都是 void 型指针,不能进行指针加减法运算,这里依旧使用转换成 char * 的技巧,得到两个地址之间的实际的物理字节总数。

2、待拷贝的源区域和目的区域是可重叠的,因此使用 memmove() 代替 memcpy(),memmove 在拷贝的内存区域有重叠时,能够智能地选择正序(从低地址开始拷贝)或倒序(从高地址开始拷贝)。但我在查阅网上资料和自己测试发现,目前 memcpy 也能识别这种情况。

LeetCode 189 以及 PAT 乙级 1008 里都是这题,题目要求不使用额外的数组空间,只允许通过 swap() 交换单个元素实现。

原文地址:https://www.cnblogs.com/wayne793377164/p/8869740.html