Java随笔记 - 实现一个自定义的BitMap

preview

  • 对于刷OJ的人来说,卡内存的题一定不陌生,而面对这种题,往往会考虑bit数组能不能派上用场。对于这道题剑指 Offer 03. 数组中重复的数字,我就尝试了使用bit数组来打标记,运行效果略微优于书上提供的解法。

BitMap

  • 对于数组中重复的数字这道题我是简单的定义了个byte数组进行了大致的实现,后来想说可以自己简单封装一个BitMap类,代码如下:

    package bitmap;import java.util.Arrays;/*** @author jiangnanmax* @email jiangnanmax@gmail.com* @description BitMap* @date 2020/12/10**/public class BitMap {private byte[] slots;private int size;private int slotCnt;private static final int STEPS_PER_SLOT = 3;private static final int BITS_PER_SLOT = 1 << STEPS_PER_SLOT;private static final int REMAINDER_TAG = 0x07;public BitMap(int size) {if (size < 0) {throw new IllegalArgumentException("The init size cannot be negative.");}this.size = size;initSlots(size);}private void initSlots(int size) {slotCnt = slotIndex(size - 1) + 1;slots = new byte[slotCnt];}private static int slotIndex(int bitIndex) {return bitIndex >> STEPS_PER_SLOT;}private static int indexInSlot(int bitIndex) {return bitIndex & REMAINDER_TAG;}public boolean valueAt(int offset) {if (offset < 0 || offset > this.size) {throw new IllegalArgumentException("Index out of bound.");}return (slots[slotIndex(offset)] & (1 << indexInSlot(offset))) != 0;}public void setValue(int offset, boolean value) {if (offset < 0 || offset > this.size) {throw new IllegalArgumentException("Index out of bound.");}if (value) {slots[slotIndex(offset)] |= (1 << indexInSlot(offset));} else {slots[slotIndex(offset)] &= ~(1 << indexInSlot(offset));}}public void and(BitMap other) {if (this.size != other.size) {throw new IllegalArgumentException("Must have same size");}for (int i = 0; i < slotCnt; i++) {this.slots[i] &= other.slots[i];}}public void or(BitMap other) {if (this.size != other.size) {throw new IllegalArgumentException("Must have same size");}for (int i = 0; i < slotCnt; i++) {this.slots[i] |= other.slots[i];}}public void xor(BitMap other) {if (this.size != other.size) {throw new IllegalArgumentException("Must have same size");}for (int i = 0; i < slotCnt; i++) {this.slots[i] ^= other.slots[i];}}public int size() {return this.size;}public void clear() {Arrays.fill(slots, (byte) 0);}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;BitMap bitMap = (BitMap) o;return size == bitMap.size && Arrays.equals(slots, bitMap.slots);}@Overridepublic String toString() {return "BitMap{" +"slots=" + Arrays.toString(slots) +", size=" + size +'}';}
    }
    

Java随笔记 - 实现一个自定义的BitMap相关推荐

  1. 抽取样本java实验报告_一个自定义classloader的函数抽取壳样本

    原标题:一个自定义classloader的函数抽取壳样本 本文为看雪论坛文章 看雪论坛作者ID:lemn 本文为 看雪安卓高研2w班(7月班)优秀学员作品. 下面先让我们来看看学员的学习心得吧! 学员 ...

  2. 【Java学习笔记】一个初学者的学习历程,分享学习JAVA心得

    毕业在即,毕业设计早早了结,单位也早已确定,但是并不打算匆匆的入职,便趁此大好时光,一边接受企业培训,一边摸索java的学习.在我看来,学习一门语言必备的几个要点在于,看,练,悟.在这个连技术也已经沦 ...

  3. Java学习笔记系列-入门篇-计算机基础

    Java学习笔记 Java学习笔记是一个持续更新的系列,工作多年,抽个空对自身知识做一个梳理和总结归纳,温故而知新,同时也希望能帮助到更多正在学习Java 的同学们. 本系列目录: 入门篇 计算机基础 ...

  4. 怎么在java中创建一个自定义的collector

    文章目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream ...

  5. java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化

    通常离开内存的东西,如果需要存储或传输是需要序列化的,在java中要序列化是要实现Serializable的(或其子类),那不实现Serializable,如何实现一个自定义的序列化呢,我首先想到的是 ...

  6. java全局变量怎么定义_怎么在java中创建一个自定义的collector

    简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类. 今 ...

  7. c++中的new_怎么在java中创建一个自定义的collector

    简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类. 今 ...

  8. JAVA 多线程 JAVA 如何开发一个自定义线程池

    1.多线程设计介绍 每一个线程的启动和结束都是比较消耗时间和占用资源的. 如果在系统中用到了很多的线程,大量的启动和结束动作会导致系统的性能变卡,响应变慢. 为了解决这个问题,引入线程池这种设计思想. ...

  9. java学习笔记(二十八)——开发一个小项目(VMeeting3.0)

    上篇文章按照较规范的产品需求文档梳理了项目的逻辑,感觉开发起来明晰了很多:挂上一篇文章java学习笔记(二十七)--开发一个小项目(VMeeting2.0)_Biangbangbing的博客-CSDN ...

  10. java中collector使用_怎么在java中创建一个自定义的collector

    怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或 ...

最新文章

  1. MFC CListCtrl控件基本使用图解
  2. 代码审计之CVE-2018-7600-Drupal远程代码执行漏洞-Render API
  3. 郑州大学研究生院 郑州大学产业技术研究院
  4. 【WCF】 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:00:56.9810000”。...
  5. linux部署项目文档,Linux上部署综合项目专业资料.doc
  6. 红旗linux6.0安装不了,在红旗linux6.0中安装vmware tools遇到的问题
  7. 高级定价基本概念理解
  8. Cydia Substrate(iOS)
  9. 三国志战略版:Daniel_S6魏延虚弱流开荒实录
  10. Win10计算机默认排序,win10系统文件夹自动排列怎么取消?win10文件夹不自动排列设置方法...
  11. python ttk separator_Python GUI编程(Tkinter)
  12. Hola Stduio导入RUBE配置的过程
  13. 计算机应用 行动计划范文,制定计算机学习计划范文3篇0001.docx
  14. 7.25 1figting!
  15. 硬盘S.M.A.R.T. status Failing
  16. MYSQL如何制作资产负债表_资产负债表该如何制作呢?搞定资产负债表,仅需这5步!...
  17. 软件工程网络15个人阅读作业2(201521123042 姚佳希)
  18. 模式识别技术漫谈(4)
  19. Plants vs. Zombies【二分答案】
  20. nginx 初级总汇知识点

热门文章

  1. java 基础:方法/函数
  2. Antelope与 Barracude MYSQL 文件格式
  3. maven怎么和ecli_傻瓜式教你安装maven以及Eclipse搭建maven环境
  4. 【计算机网络】谢希仁笔记 应用层
  5. 聊聊两个状态管理库 Redux Recoil
  6. 12面魔方公式图解法_魔方小站三级12面魔方教程拍个视频
  7. python读取加密word_python的特殊文件操作——excel、PDF、word、json、csv
  8. 青龙面板 企业微信应用推送
  9. 专业技术计算机应用能力考试ppt2007,全国专业技术人员计算机应用能力考试PPT题库.pdf...
  10. unity3d 重力加速度传感器控制摄像头