2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i] = { a, b, c }表示,用户i报
2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1,
给定正数M,表示实验数量,实验编号从0~M-1,
给定长度为N的二维数组A,
A[i] = { a, b, c }表示,用户i报名参加了a号、b号、c号实验,
给定正数Q,表示查询的条数
给定长度为Q的二维数组B,
B[i] = { e, f }表示,第i条查询想知道e号、f号实验,一共有多少人(去重统计)。
返回每一条查询的结果数组。
数据描述 :
1 <= N <= 10^5,
1 <= M <= 10^2,
1 <= Q <= 10^4。
所有查询所列出的所有实验编号数量(也就是二维数组B,行*列的规模) <= 10^5。
来自字节。
答案2023-02-12:
位操作优化。
代码用rust编写。代码如下:
use rand::Rng;
use std::collections::HashMap;
use std::collections::HashSet;
use std::iter::repeat;
fn main() {
let N = 100;
let M = 20;
let Q = 50;
let testTime = 5000;
println!("功能测试开始");
for i in 0..testTime {
let n = rand::thread_rng().gen_range(0, N) + 1;
let m = rand::thread_rng().gen_range(0, M) + 1;
let mut A = randomMatrix(n, rand::thread_rng().gen_range(0, m) + 1, m);
let q = rand::thread_rng().gen_range(0, Q) + 1;
let mut B = randomMatrix(q, rand::thread_rng().gen_range(0, m) + 1, m);
let ans1 = record1(n, m, q, &mut A, &mut B);
let ans2 = record2(n, m, q, &mut A, &mut B);
let mut pass = true;
for j in 0..q {
if ans1[j as usize] != ans2[j as usize] {
pass = false;
break;
}
}
if !pass {
println!("出错了!");
break;
}
}
println!("功能测试结束");
}
// 暴力方法
// 为了验证
fn record1(n: i32, m: i32, q: i32, A: &mut Vec<Vec<i32>>, B: &mut Vec<Vec<i32>>) -> Vec<i32> {
let mut expUsersMap: HashMap<i32, HashSet<i32>> = HashMap::new();
for i in 0..m {
expUsersMap.insert(i, HashSet::new());
}
for i in 0..n {
for exp in A[i as usize].iter() {
let mut a = expUsersMap.get_mut(exp).unwrap();
a.insert(i);
}
}
let mut ans: Vec<i32> = repeat(0).take(q as usize).collect();
let mut help: HashSet<i32> = HashSet::new();
for i in 0..q {
help.clear();
for exp in B[i as usize].iter() {
for user in expUsersMap.get(exp).unwrap().iter() {
help.insert(*user);
}
}
ans[i as usize] = help.len() as i32;
}
return ans;
}
// 正式方法
fn record2(n: i32, m: i32, q: i32, A: &mut Vec<Vec<i32>>, B: &mut Vec<Vec<i32>>) -> Vec<i32> {
// n 一共有多少人
// 任何一个实验,需要几个整数,能表示所有人谁出现谁没出现?
let parts = (n + 31) / 32;
// m 0 ~ m -1
// [i] [.........]
let mut bitMap: Vec<Vec<i32>> = repeat(repeat(0).take(parts as usize).collect())
.take(m as usize)
.collect();
for i in 0..n {
// i 人的编号 : a b c
for exp in A[i as usize].iter() {
bitMap[*exp as usize][(i / 32) as usize] |= 1 << (i % 32);
}
}
let mut ans: Vec<i32> = repeat(0).take(q as usize).collect();
for i in 0..q {
// i号查询 : a、c、e,一共有多少去重的人
// a[0] | c[0] | e[0] -> 几个1
// a[1] | c[1] | e[1] -> 几个1
let mut all = 0;
for j in 0..parts {
let mut status = 0;
for exp in B[i as usize].iter() {
status |= bitMap[*exp as usize][j as usize];
}
all += countOnes(status);
}
ans[i as usize] = all;
}
return ans;
}
// 大厂刷题班,32节,leetcode专题 : https://leetcode.com/problems/number-of-1-bits/
fn countOnes(mut n: i32) -> i32 {
let mut n2: u32;
if n < 0 {
n2 = (u32::MAX as i64 + n as i64 + 1) as u32;
} else {
n2 = n as u32;
}
let mut n = n2;
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
return n as i32;
}
// 为了测试
fn randomMatrix(n: i32, m: i32, v: i32) -> Vec<Vec<i32>> {
let mut ans: Vec<Vec<i32>> = repeat(repeat(0).take(m as usize).collect())
.take(n as usize)
.collect();
for i in 0..n {
for j in 0..m {
ans[i as usize][j as usize] = rand::thread_rng().gen_range(0, v);
}
}
return ans;
}

2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i] = { a, b, c }表示,用户i报的更多相关文章
- java基础:进制详细介绍,进制快速转换,二维数组详解,循环嵌套应用,杨辉三角实现正倒直角正倒等腰三角,附练习案列
1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 如何加断点 选择 ...
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
1.数组基础 1.什么是数组: 同一类型数据的集合,就是一个容器. 2.数组的好处: 可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式: (一 ...
- PHP二维数组如何根据某个字段排序
分享下PHP二维数组如何根据某个字段排序的方法. 从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条. 本文记录的要实现的功能类似于 ...
- php获取一维,二维数组长度的方法(有实例)
在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧.php如何获取数组的长度,使用php函数c ...
- 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- php 将一个或多个二维数组组合成一个二维数组并根据某个字段排序排序
最近再写项目的时候,碰到一个问题:如何将一个或多个二维数组组合成一个二维数组并根据某个字段排序排序:实在是想不到哪个php库中有哪个函数能实现,只能自己写一个了,将代码写出来后,发现自己的代码繁琐,并 ...
- c/c++ 图相关的函数(二维数组法)
c/c++ 图相关的函数(二维数组法) 遍历图 插入顶点 添加顶点间的线 删除顶点 删除顶点间的线 摧毁图 取得与v顶点有连线的第一个顶点 取得与v1顶点,v1顶点之后的v2顶点的之后的有连线的第一个 ...
- c/c++ 图的创建(二维数组法)
c/c++ 图的创建(二维数组法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点,和节点之 ...
- 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- Java编程基础阶段笔记 day06 二维数组
二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...
随机推荐
- leetcode medium 记录 1-50
# Title Solution 二刷 Difficulty 备注 2 Add Two Numbers X Medium 3 Longest Substring Wi ...
- 《Zookeeper分布式过程协同技术详解》之简介-分布式与Zookeeper简介
[常见的分布式架构场景面临的问题]一般在主从架构中,主节点进程负责跟踪从节点的状态和任务的有效性,并分配任务到从节点.而这种架构中必须要解决的几个问题是,主节点崩溃.从节点崩溃.通信故障.主节点崩溃: ...
- NTP同步时间
什么是NTPNTP:Network Time Protocol(网络时间协议) ️ NTP 是用于同步网络中计算机时间的协议.它的用途是把计算机的时钟同步到世界协调时UTC. UTC:Universa ...
- lua的一些封装方法
获取点击屏幕坐标 1 function getTouchPosition() 2 local locationX, locationY 3 4 local listener = cc.EventLis ...
- 基于Mindspore2.0的GPT2预训练模型迁移教程
摘要: 这篇文章主要目的是为了让大家能够清楚如何用MindSpore2.0来进行模型的迁移. 本文分享自华为云社区<MindNLP-基于Mindspore2.0的GPT2预训练模型迁移教程> ...
- 2-2 理解const
1 const 在引用中注意不能为常量绑定一个非常量的引用 在指针中区分low-level const和top-level const const通常用于定义常量,一经定义不许修改,且使用const必 ...
- Javaweb问题解决--在.java文件里面写sql语句模糊查询不成功的原因
问题描述 在上学期,我就遇到了这个问题(别骂别骂),然后当时卡住之后,Mybatis闯入了我的视线,然后直接换用了较为方便的Mybatis框架结构,这个问题也就被搁置了,今天重新提起,优势慢慢地查阅了 ...
- Java8 获取当天日期的前一天
LocalDateTime.now().plusDays(-1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
- Python地理分析库whitebox在Anaconda中的配置
本文介绍在Anaconda环境下,安装Python中的一个高级地理空间数据分析库whitebox的方法. 首先,我们打开"Anaconda Prompt (Anaconda)&quo ...
- LeetcodePractice-数组
目录 88. 合并两个有序数组 思路解析 字节&1. 两数之和 思路解析 腾讯&15. 三数之和 思路解析 18. 四数之和 思路解析 解释下,tmpSum为什么用int不行,需要用i ...