zoukankan      html  css  js  c++  java
  • LeetCode刷题:解码异或后的排列

    已知条件:
    给定两个数组A[n],B[n-1],n为奇数,注意这里n说的是数组长度,底下的n是数组索引
    A[n]中数组元素为n的正整数排列,顺序不一定
    约定A[i]^A[i+1]=B[i]
    异或操作的特性:
    0^n=n^0=n
    n^n=0


    因为A[i]^A[i+1]=B[i],所以可得(A[0]^A[1])^(A[1]^A[2])^(A[2]^A[3])........(A[n-2]^A[n-1])^(A[n-1]^A[n])=B[0]^B[1]^B[2]....^B[n-1]
    根据异或特性去掉些多余的东西可得公式
    A[0]^A[n]=B[0]^B[1]^B[2]....^B[n-1]

    那下一步可得
    (A[0]^A[1])^(A[0]^A[2])^..........(A[0]^A[n-1])^(A[0]^A[n])=(B[0])^(B[0]^B[1])^(B[0]^B[1]^B[2])^......^(B[0]^B[1]^B[2]....^B[n-1])

    由于A数组长度为奇数,B数组长度为偶数,所以左侧A[0]有偶数个,右侧B[0]有偶数个,B[1]有奇数个,以此类推,B[n-1]中n-1为偶数则B[n-1]有偶数个,为奇数则B[n-1]有奇数个
    根据异或特性去掉多余可得
    A[1]^A[2]^....^A[n]=B[1]^B[3]...^B[奇数末尾]

    又因为A[n]中数组元素为n的正整数排列
    A[0]^A[1]^A[2]^....^A[n]=1^2^...n+1
    A[0]=(1^2^...n+1)^(A[1]^A[2]^....^A[n])
    A[0]=(1^2^...n+1)^(B[1]^B[3]...^B[奇数末尾])

    知道A[0],已知B[n]的数组元素,这时候题目就很简单了

    借用一下优秀代码演示一下

    class Solution {
    public:
        vector<int> decode(vector<int>& encoded) {
            // 前n个整数的排列这个条件,我的妈
            int sum = 0;
            for(int i = 1; i <= encoded.size() + 1; i ++)
                sum ^= i;
            for(int i = 1; i < encoded.size(); i += 2)
                sum ^= encoded[i];
            // 此时sum就是perm[0]
            vector<int> ans(encoded.size()+1);
            ans[0] = sum;
            for(int i = 1; i < ans.size(); i ++)
                ans[i] = ans[i-1] ^ encoded[i-1];
            return ans;
        }
    };
  • 相关阅读:
    Spring Richclient — 企业级富客户端开发框架介绍,第 1 部分
    oracle的表名、字段名、constraint名的长度限制分别是多少?
    eclipse指定启动的jdk
    女人为什么爱攀比?
    Oracle一些常用的查询命令总结(持续更新)
    js冒泡事件之之之
    Aspose插件
    oracle11g导入到10g
    转:OpenCms 9.0.1汉化
    metasploit常用命令
  • 原文地址:https://www.cnblogs.com/suxia/p/14756133.html
Copyright © 2011-2022 走看看