在O(1)空间和O(n)时间中用c ++重新排列数组

时间:2019-05-23 19:54:40

标签: c++ bit-manipulation

我被赋予“重新排列给定的数组,以使Arr [i]成为具有O(1)多余空间的Arr [Arr [i]]”。 我得到整数向量作为输入。 令N为向量中元素的数量。 数组中的所有元素都在[0,N-1]范围内。 N * N对于有符号整数不会溢出。

链接:https://www.interviewbit.com/problems/rearrange-array/

我试图将数组的原始值移到int的高位,即从16位到32位(假设在c ++中为32位int),然后将Arr [i]的新值添加到int的低位给出了“ N * N对于有符号整数不会溢出”的含义,因此位0到15之间存在差异,因此数字必须能够容纳C ++中为int提供的一半空间。

    void Solution::arrange(vector<int> &A) {
    int n=A.size();    
    for(int i=0;i<n;i++){
        A[i]<<=16; //original values are moves to higher bits
    }
    for(int i=0;i<n;i++)
    {
        int p = A[i]>>16;   //get the position i.e. Arr[i] part of Arr[Arr[i]]
        int v = A[p]>>16;   //the value Arr[Arr[i]]
        A[i]|=v;           // bit-wise or the new value to move it to lower bits. 
    }
    for(int i=0;i<n;i++)
    {
         A[i]&=65535;   // upper bits from 16 to 32 are set to zero
    }
    }

对于较小的输入它工作正常,但是在提交解决方案时显示分段错误。请帮助解决细分错误。

0 个答案:

没有答案