首页 > 其他分享 >异或1的妙处

异或1的妙处

时间:2023-02-16 21:44:23浏览次数:37  
标签:length nums int res 妙处 异或 new

异或1的妙处

刷lc每日一题时,看评论发现一种异或1的解法,感觉很有趣就研究了一下。

题目如下:

给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:

从 nums 选出 两个 相等的 整数
从 nums 中移除这两个整数,形成一个 数对
请你在 nums 上多次执行此操作直到无法继续执行。

返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-number-of-pairs-in-array

个人题解:

public int[] numberOfPairs(int[] nums) {
    int[] res = new int[]{0,1};
    if (nums.length == 1)
        return res;
    Map<Integer, Integer> map = new HashMap<>();
    int count = 0;
    for (int i = 0; i < nums.length; i++) {
        if (map.containsKey(nums[i])){
            map.remove(nums[i]);
            count++;
        }else
            map.put(nums[i], i);
    }
    int leftNumber = nums.length - count * 2;
    res[0] = count;
    res[1] = leftNumber;

    return res;
}

效率低下

评论题解:

class Solution {
    public int[] numberOfPairs(int[] nums) {
        int ans = 0;
        int[] a = new int[101];
        for (int num : nums) {
            if ((a[num] ^= 1) == 0) ans++; //判断是否重复出现过数组中数值
        }
        return new int[]{ans, nums.length - 2 * ans};
    }
}

看到异或1有点不解

经过百度和自我验证

发现如果是一个偶数1,那么答案是偶数+1.如果是一个奇数1,那么答案是奇数-1

所以上述代码中初始化的a数组中全为0,每次取到num为下标的值进行异或1,如果第一次取到则会得到1的结果,如果是第二次,则异或得到0,数对+1。

标签:length,nums,int,res,妙处,异或,new
From: https://www.cnblogs.com/chengbb/p/17128432.html

相关文章

  • 【算法题--异或操作】找出数组中唯一没有重复的那个元素
    在我的博客上有一篇博文是提到C#里面的异或操作https://www.cnblogs.com/wphl-27/p/17104240.html有一个算法题是需要用到C#中的异或操作的,这道算法题就是获取一个数组中......
  • Codeforces Round #851 (Div. 2)-F. XOR, Tree, and Queries-树、异或、并查集
    题目:https://codeforces.com/contest/1788/problem/F题解:(首先他和线性基没什么瓜系)想这个问题大概可以分成几个部分:1、很自然地考虑记\(p_x\)表示从根节点走到x路径......
  • C#中的异或操作
    在看一个算法题时,看到异或这种操作,平时在项目开发中在代码中用的很少,于是特意看了一下,总结如下:异或在英文中是ExclusiveOR,缩写成xor.  在C#中用^来表示异或运算......
  • ZYB loves Xor I HDU - 5269(01字典树,二进制,异或,lowbit)
    题意:给出一列数,求任意两个数的异或值得lowbit值和。PS:一个数的lowbit为,第一个不为0的数前有k个0,则为2^k。题解:利用字典树存储这些数的二进制,每次插入将相应的异或的lowbit......
  • &(按位与运算)、|(按位或运算)、^(异或运算)
    按位与运算符(&)对俩个数据进行二进制按位与运算。二进制规则:0&0=0;  0&1=0;   1&0=0;  1&1=1双1为1,否则为0.例:102&255即:01100110&11111111=011001......
  • 【题解】P5169 xtq的异或和
    再强没有xtq!!!1思路多项式的正确用法。首先根据P4151[WC2011]最大XOR和路径的神秘结论,这里只需要任意求出原图的一棵生成树,以及所有只包含一条非树边的简单环就可以维......
  • 选数异或(思维)
    题意给定一个长度为\(n\)的数列\(A_1,A_2,\dots,A_n\)和一个非负整数\(x\),给定\(m\)次查询,每次询问能否从某个区间\([L,R]\)中选择两个下标不同的数使得他们的异或等于\(......
  • Luogu P8773 [蓝桥杯 2022 省 A] 选数异或
    https://www.luogu.com.cn/problem/P8773因为\(a\texttt{xor}b=c\)则\(a\texttt{xor}c=b\),对于\(a_i\)找到\(a_i\texttt{xor}x\)离其最近的位置,放在ST......
  • 【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
    写在前面:本章主要内容为了解和确认NAND/NOR/XOR门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用FPGA来验证Verilog实现的电路的行为。本章目......
  • 选数异或
    问题描述给定一个长度为 �n 的数列 �1,�2,⋯,��A1​,A2​,⋯,An​ 和一个非负整数 �x,给定 �m 次查询,每次询问能否从某个区间 [�,�][l,r] 中选择两个数使得他......