zoukankan      html  css  js  c++  java
  • 【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() 交换单个元素实现。

  • 相关阅读:
    IOS之helloworld
    xcode4.2中创建Navigation-Based Application
    IOS之数据持久化
    IOS之多视图应用程序
    IOS之高级控件表视图
    IOS之基本UI控件
    IOS之导航控制器与表视图
    IOS之应用程序设置
    IOS之高级控件拾取器
    IOS之UI基础
  • 原文地址:https://www.cnblogs.com/wayne793377164/p/8869740.html
Copyright © 2011-2022 走看看