当前位置: 首页 > news >正文

用 “按位统计” 找唯一出现少于 3 次的数

在这里插入图片描述
这道题如果用哈希表统计次数,空间复杂度是 O (n);

如果用异或,只能处理 “出现偶数次抵消” 的情况(比如出现 2 次),面对 3 次、5 次这类奇数次数就失效了。

首先,这里用到了一个核心规律:

对于任意一个二进制位(比如第 0 位、第 1 位),如果某个数出现了 m 次,那么这个数在该位上的 1 的总贡献,一定是 m 的倍数。

代码逻辑

1. 按位统计 1 的个数
int[] cnts = new int[32]; 
for (int num : arr) {for (int i = 0; i < 32; i++) {cnts[i] += (num >> i) & 1; }
}
2. 重构目标数
int ans = 0;
for (int i = 0; i < 32; i++) {if (cnts[i] % m != 0) {ans |= (1 << i); }
}

完整代码

// LeetCode 137(其他数出现3次,目标数出现1次)
public static int singleNumber(int[] nums) {return find(nums, 3); // 直接调用通用解法,m=3
}// 通用解法:数组中只有1种数出现次数<m,其他数都出现m次,返回该数
public static int find(int[] arr, int m) {// cnts[i]:统计数组中所有数在第i位(0~31)上1的总个数int[] cnts = new int[32]; // 遍历数组,统计每一位上1的总个数for (int num : arr) {for (int i = 0; i < 32; i++) {// 提取num第i位的1,累加到cnts[i]cnts[i] += (num >> i) & 1; }}// 根据cnts重构目标数int ans = 0;for (int i = 0; i < 32; i++) {// 如果第i位1的总个数不是m的倍数,说明目标数第i位是1if (cnts[i] % m != 0) {// 把第i位设为1ans |= (1 << i); }}return ans;
}
http://www.dtcms.com/a/471400.html

相关文章:

  • 【解决】FAILED TO lOAD IDLINUX.c32
  • 去重表格的几种思路
  • 网站美工做的是什么合肥外贸网站建设公司排名
  • 用mitmproxy替代selenium-wire
  • 响应式网站怎么改成都住建局官网住建蓉e办
  • 参数传递:从字符串拼接到 qs 标准化时代
  • 清浦网站建设清河做网站
  • 中山企业网站建设公司网站内容seo
  • 如何快速建立网站装修无忧网
  • 网站建设尾款收取公司网站界面如何设计
  • 网站前端设计图投诉网站制作
  • linux 启动脚本rcS 及分区挂载分析
  • 快递公司网站怎么做贵州网站开发哪家便宜
  • 10大免费开源HR系统软件整理(含国内外对比)
  • 分布式架构 vs 微服务架构:从理念到落地的全面解析
  • 【Android】Android系统体系结构
  • 你使用的Nano Banana安全吗?
  • 移动微网站建设深圳做网站推广排名
  • 云岭建设集团的网站要修改wordpress目录下的文件权限
  • TCP/IP 协议族—理论与实践(二)
  • 01--HTML基础
  • 专业做网站开发.net做网站之前设置
  • 住宅IP与数据中心IP的区别
  • 惠州网站建设电话不限次数观看视频的app
  • 湖北省建设教育协会网站词爱站的关键词
  • 【笔记】kill -9的用法
  • 广州省建设监理协会网站加强公司内部网站建设
  • fpga开发板ZYNQ 璞致 PZ7010/7020 邮票孔核心板简介-ZYNQ7000系列小系统学习板
  • Knife4j文档报Knife4j文档请求异常
  • 合肥 做网站的个人网页设计ps