c++ 对异或置换进行解码的结果总是唯一的,这是真的吗?

kxkpmulp  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(79)

我正在努力完成LeetCode任务:Decode XORed Permutation
有一个整数数组perm,它是前n个正整数的排列,其中n总是奇数。
它被编码到另一个长度为n - 1的整数数组中,这样encoded[i] = perm[i] XOR perm[i + 1]。例如,如果perm = [1,3,2],则encoded = [2,1]。
给定编码数组,返回原始数组perm。保证答案存在且唯一。
我想这样解决:
1.对编码数组的所有元素进行异或。我们将其命名为X
1.对编码数组中位于偶数位置的元素进行XOR(因此我删除了结果置换数组中除第一个元素外的所有元素)。让我们将其命名为Y
1.我做X xor Y,它是我在排列数组中的第一个元素。
如果我知道第一个元素,我可以很容易地解决整个问题。这是代码:

std::vector<int> decode(std::vector<int> encoded) {
    int xor_of_encoded = 0;
    int xor_without_known_elements = 0;
    for (int i = 0; i < encoded.size(); i++) {
        xor_of_encoded ^= encoded[i];
        if (i % 2 == 1)
            xor_without_known_elements ^= encoded[i];
    }

    std::vector<int> decoded(encoded.size() + 1);
    decoded[0] = xor_of_encoded ^ xor_without_known_elements;

    for (int i = 1; i <= encoded.size(); i++) {
        decoded[i] = (encoded[i - 1] ^ decoded[i - 1]);
    }

    return decoded;
}

字符串
它是如何工作的视觉表示:

6   5   4   6         <-- encoded
   |   |   |   |
   Ʌ   Ʌ   Ʌ   Ʌ
  / \ / \ / \ / \
 |   V   V   V   |
 |   |   |   |   |
 2   4   1   5   3       <-- result


当我提交我的解决方案时,它通过了第二个测试用例:[6,5,4,6]。它失败了[3,1][12,6,11,10,5,3,4,6],可能还有其他用例,但我没有机会测试它的其余用例。问题是,我的代码产生的结果符合任务的假设。
当我手动XOR上述代码的结果时(decoded[i] xor decoded[i+1],这就是如何创建任务中提到的编码数组),我能够重新创建编码数组。
所以我对这个问题很困惑,我是运气好还是错过了什么,或者结果不是唯一的?

omhiaaxx

omhiaaxx1#

你需要找到第一个丢失的数字。
从1到n的所有数字中,有多少位设置为0?
假设丢失的数字是0,解码其余的数字,发现有 a 结果设置了位0,而 b 结果未设置位0。
如果您设置了第一个假定数字的位0,那么将有 b 个设置了位0的结果,而 a 个未设置位0的结果。
由于 a+B = n,并且 n 是奇数,我们知道 a!= B,因此将缺失的第一个数字的位0设置为产生正确计数的任何值。
对剩下的比特做同样的操作,你就得到了第一个数字,并且可以很容易地解码剩下的。

相关问题