首页 > 其他分享 >【Leetcode 2032 】 至少在两个数组中出现的值 —— 哈希表与按位运算符(最全的注解)

【Leetcode 2032 】 至少在两个数组中出现的值 —— 哈希表与按位运算符(最全的注解)

时间:2024-08-26 16:25:08浏览次数:15  
标签:const 数组 number 运算符 表与 哈希 nums1 nums2 nums3

给你三个整数数组 nums1nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成数组中的元素可以按 任意 顺序排列。

示例 1:

输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3]
输出:[3,2]
解释:至少在两个数组中出现的所有值为:
- 3 ,在全部三个数组中都出现过。
- 2 ,在数组 nums1 和 nums2 中出现过。

示例 2:

输入:nums1 = [3,1], nums2 = [2,3], nums3 = [1,2]
输出:[2,3,1]
解释:至少在两个数组中出现的所有值为:
- 2 ,在数组 nums2 和 nums3 中出现过。
- 3 ,在数组 nums1 和 nums2 中出现过。
- 1 ,在数组 nums1 和 nums3 中出现过。

示例 3:

输入:nums1 = [1,2,2], nums2 = [4,3,3], nums3 = [5]
输出:[]
解释:不存在至少在两个数组中出现的值。

哈希表

/*
https://leetcode.cn/u/cshappyeveryday/
执行用时:71 ms, 在所有 Typescript 提交中击败了100.00%的用户
内存消耗:52.64 MB, 在所有 Typescript 提交中击败了100.00%的用户
时间复杂度:O(n)
2024年8月26日 
*/
function twoOutOfThree2(
  nums1: number[],
  nums2: number[],
  nums3: number[]
): number[] {
  const nums2Set = new Set<number>(nums2);
  const nums3Set = new Set<number>(nums3);
  const res = new Set<number>();
  for (const n of nums1) {
    if (nums2Set.has(n) || nums3Set.has(n)) {
      res.add(n);
    }
  }
  for (const n of nums2) {
    if (nums3Set.has(n)) {
      res.add(n);
    }
  }
  return [...res];
}

按位运算符

//按位运算符
function twoOutOfThree(
  nums1: number[],
  nums2: number[],
  nums3: number[]
): number[] {
  const map = new Map<number, number>();
  for (const n of nums1) {
    // 1 为 二进制位
    map.set(n, 1);
  }
  for (const n of nums2) {
    // 如果在nums1中找到相同的值,则值为 1,而 1 | 2 = 3
    // 如果在nums1中没有找到相同的值,则值为 0,而 0 | 2 = 2
    map.set(n, (map.get(n) || 0) | 2);
  }

  for (const n of nums3) {
    // 如果在nums1、nums2中找到相同的值,则分三种情况
    //情况1  ——  值为 2,而 2 | 4 = 6
    //情况2  ——  值为 3,而 3 | 4 = 7
    //情况3  ——  值为 1,而 1 | 4 = 5
    // 如果在nums1、nums2中没有找到相同的值,则0 | 4 = 4
    map.set(n, (map.get(n) || 0) | 4);
  }

  const res: number[] = [];
  // 此时 v 的值可能为[没有匹配的值] 1 , 2 , 4
  //    [nums2 与 nums1 匹配的值] 3
  //    [nums2 与 nums3 匹配的值] 6
  //    [nums1 与 nums3 匹配的值] 5
  //[nums1 与 nums2 与 nums3 匹配的值]  7
  for (const [k, v] of map) {
    //以下分为7种情况
    //情况1   v = 1,v-1 = 0, 则 1 & 0 = 0
    //情况2   v = 2,v-1 = 1, 则 2 & 1 = 0
    //情况3   v = 3,v-1 = 2, 则 3 & 2 = 2
    //情况4   v = 4,v-1 = 3, 则 4 & 3 = 0
    //情况5   v = 5,v-1 = 4, 则 5 & 4 = 4
    //情况6   v = 6,v-1 = 5, 则 6 & 5 = 4
    //情况7   v = 7,v-1 = 6, 则 7 & 6 = 6
    //只有情况 1,2,4为0,而它们正好处于 [没有匹配的值]
    if ((v & (v - 1)) !== 0) {
      res.push(k);
    }
  }
  return res;
}

标签:const,数组,number,运算符,表与,哈希,nums1,nums2,nums3
From: https://blog.csdn.net/Caoshuang_/article/details/141560610

相关文章

  • 运算符重载,两种常见运算符重载(加号运算符重载,左移运算符重载)
    一、为什么要进行运算符重载?在我们编写程序时,我们需要用到自定义数据类型,但是我们普通的运算符只能正常操作系统内置的数据类型比如我们常用的int,double无法自动识别我们的自定义数据类型。例如你设置了一个Person类,他有年龄,身高,体重等属性,那你做两个Person对象相加时系统......
  • LeetCode 690. 员工的重要性(哈希表、深度优先搜索dfs)
    题目:690.员工的重要性思路:先用哈希表map将每个员工的信息映射到员工ID对应的下标位置。接着使用深度优先搜索dfs,来记录总和即可。细节看注释/*//DefinitionforEmployee.classEmployee{public:intid;intimportance;vector<int>subordinates;......
  • 运算符
    运算符运算符类型符号算数运算符+,-,*,/,%,++,--赋值运算符=关系运算符>,<,>=,<=,==,!=,instanceof逻辑运算符&&,||,!注意在int类型/int类型时及时强制转换类型小技巧ctr+D复制当前行到下一行幂运算很多运算我们会使用工具类 doublepow=Math.pow......
  • Shell脚本学习_运算符
    目录一、算数运算符1、expr命令:2、算数运算符介绍:3、使用(()) 进行运算: 4、bc命令:1.bc中互动式的数学运算:2.非互动式的管道运算:3.非互动式的输入重定向运算:二、比较运算符 1、整数比较运算符:2、字符串比较运算符:3、[[]] 和 []的区别:三、布尔运算......
  • C++ //练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。
    C++Primer(第5版)练习19.23练习19.23为你的Token类添加移动构造函数和移动赋值运算符。环境:LinuxUbuntu(云服务器)工具:vim 代码块classToken{ public: Token():tok(INT),ival(0){} Token(constToken&t):tok(t.tok){copyUnion(t);} Token&operator=(......
  • 运算符 类定义 Math类的使用 数组的使用
    1.基本的算术运算符5个:+ - * / %都是双目运算符(两个操作数),其中%要求的两个操作数必须为整数。2.自增、自减运算符++ --注意作为前缀和后缀的用法不同.3.表达式计算中的数据类型转换(1)自动类型转换:当参与运算的两个操作数类型不同时,先把低类型的数据转换为高类......
  • Python 教程(三):Python运算符合集
    Python中常用的一些运算符类型算术运算符+:加法-:减法*:乘法/:除法(结果为浮点数)%:取模(即除法余数)**:幂(指数)//:整除(结果为商的整数部分)示例代码: a=10b=3print("加法:",a+b)#输出13print("减法:",a-b)#输出7print("乘法:",a*b)#输出3......
  • 运算符
    1:运算对常量和变量进行操作的过程称为运算。2:运算符对常量和变量进行操作的符号称为运算符3:操作数参与运算的数据称为操作数4:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的式子体现的是不同类型的表达式。注意事项:一个表达式最终......
  • 3.4 hash(哈希)
    hash(哈希)hsetkeyfieldvaluehgetkeyfieldhgetallinfohmgetkeyfield1field2...hincrbykeyfieldnumber专门用于结构化的数据信息。对应的就是map/结构体结构:键key:{ 域field:值value, 域field:值value, 域field:值value,}(1)设置指定键的属性......
  • FPGA开发——verilog的运算符以及相关优先级的介绍
    一、简介        在我们学习任何一门编程语言时,不可避免的都会遇见运算符和相关的运算优先级的问题,只有掌握了各个运算符的优先级关系我们才能进行更好的代码编写。在前面的时候因为我没有遇到因为优先级而导致的工程结果错误,所以没有过多注意,但是遇到之后才发现运算......