菜鸟笔记
提升您的技术认知

c 反转数组(reverse array)的四种方法-ag真人游戏

反转数组就是把数组里的元素反过来存储。

比如原来的数组是:1,4,2,3

倒转过以后的数组就是:3,2,4,1

这是hackerrank的数据结构部分的第一道题,在讨论区发现了这四种解法,很有意思。

方法一:

思路是:第一项和最后一项互换;第二项与倒数第二项互换;第三项与倒数第三项互换;以此类推,直到换到中间。

时间复杂度是o(n),因为对于有n个元素的数组a,需要交换n/2次。

空间复杂度是o(1),因为只开辟了2个int的空间。

vector reversearray(vector a) {
    int temp = 0;
    int n = a.size();
    for (int i = 0; i < n/2;   i) {
        temp = a[n-i-1];
        a[n-i-1] = a[i];
        a[i] = temp;
    }
    return a;
}

方法二:

思路是:新建一个数组b,从后往前遍历数组a,把遍历到的元素加到数组b的后面。

时间复杂度是o(n),需要遍历n次。

空间复杂度是o(n),因为要开辟与输入的数组一样大的空间。

vector reversearray(vector a) {
    vector b;
    for(vector::iterator x = a.end()-1; x >= a.begin(); x--)
        b.push_back(*x);
    return b;
}

方法三:

这是一个神奇的思路,用的是c 11标准中,vector新的初始化方式。

直接返回一个新的vector,初始化的内容就是数组a从右到左的值。

vector reversearray(vector a)
{
    return {a.rbegin(), a.rend()};
}

方法四:

这个是使用c stl库里的reverse函数,需要包含头文件。

vector reversearray(vector a)
{
    reverse(a.begin(),a.end());
    return a;
}

同一段程序在不同性能的电脑上运行,运行时间的毫秒数是不同的,但运行时间的cpu tick数是相同的。所以用cpu tick数来比较运行时间。

int main( void )    
{    
    int tick=0;
    vector a,b;
    for(int i=1;i<=3000000;i  )   //给数组3000000个元素
    {
        a.push_back(i);           //给数组赋初值
    }
    tick=clock();                 //记录一下反转数组之前的tick数
    b=reversearray(a);            //执行反转数组操作
    tick=clock()-tick;            //记录一下反转数组用了多少个tick
    printf("%d tick",tick);       //显示反转数组用了多少个tick
    return 0;
} 

使用上面四种反转数组的方法,在n=3000000的情况下测试,得到的结果是这样的:

方法 用时
方法一(左右互换) 28 tick
方法二(倒序赋值) 109 tick
方法三(直接返回) 55 tick
方法四(使用stl) 37 tick
网站地图