有序数组变成交替有序 原位置交换 阿里17年笔试题

思想是这样的:对于每一个位置的数字,我们是能够知道他最终的位置,如下:

if(i<n/2)
      next=2*i+1;
else
      next=(n-1-i)*2;

然后从头开始找它应该待的位置,直至出现环路。整个数组可能有多个环路,所以还得记录所有数字是否已经在正确位置,题目中说都是正数,因此可以用符号位作为标志位,最后再变回来即可。代码如下:


#include <iostream>
#include <vector>
using namespace std;

void reorder(vector<int> & num){
    int temp,pre,i,n=num.size(),next;
    for(i=0;i<n;i++){
        if(num[i]<0)
            continue;
        else{
            temp=num[i];
            pre=num[i];
            if(i<n/2)
                next=2*i+1;
            else
                next=(n-1-i)*2;

            while(next!=i){
                temp=num[next];
                num[next]=-pre;
                pre=temp;
                if(next<n/2)
                    next=2*next+1;
                else
                    next=(n-1-next)*2;
            }
            num[next]=-pre;
        }
    }
    for(i=0;i<n;i++)
        num[i]=-num[i];
}

int main() {
    vector<int> tmp;
    for(int i=10;i>=1;i--)
        tmp.push_back(i);
    reorder(tmp);
    for(int i=0;i<10;i++)
        cout<<tmp[i]<<" ";
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值