常见の算法5

位图

一个int类型32字节,可以表示0-31这32个数出没出现过,出现过1没出现0,再扩大一点搞个数组,就可以表示0-1023出没出现过,一个long类型可储存64位

如何把10位组成的数,第四位由1改成零

package class05;import java.util.HashSet;public class Code01_BitMap1 {public static class BitMap {private long[] bits;public BitMap(int max) {bits = new long[(max + 64) >> 6];//右移6位就是÷64的意思}	//要准备多少个long就是(max + 64) >> 6个public void add(int num) {//num÷64定位到是第几个整数,num%64定位到是第几个整数的第几位//而%64等价于&63(只保留n的后七位0-63,前面的&63后全为0)bits[num >> 6] |= (1L << (num & 63));//不能1左移32位,1默认是整形32位必须是1L}//删除public void delete(int num) {bits[num >> 6] &= ~(1L << (num & 63));//1左移这么些位然后取反,然后和n做与运算}//有没有某个数(这一位不是0就存在)public boolean contains(int num) {return (bits[num >> 6] & (1L << (num & 63))) != 0;}}//验证public static void main(String[] args) {System.out.println("测试开始!");int max = 10000;BitMap bitMap = new BitMap(max);//申请一个mapHashSet<Integer> set = new HashSet<>();//申请一个哈希set然后这俩作比较int testTime = 10000000;for (int i = 0; i < testTime; i++) {int num = (int) (Math.random() * (max + 1));double decide = Math.random();if (decide < 0.333) {bitMap.add(num);set.add(num);} else if (decide < 0.666) {bitMap.delete(num);set.remove(num);} else {if (bitMap.contains(num) != set.contains(num)) {System.out.println("Oops!");break;}}}for (int num = 0; num <= max; num++) {if (bitMap.contains(num) != set.contains(num)) {System.out.println("Oops!");}}System.out.println("测试结束!");}}

1.快速写出46的二进制形式46=32+14=32+8+4+2=101110

2,^异或运算等价于二进制无进位相加

3.a&b得到的结果<<1位得到进位信息

故a=46,b=20,c=两者无进位相加结果,d等于进位信息

c=0101110^0010100=0111010=58

d=a&b<<1=0000100<<1=0001000=8,c+d=66=a+b

但是违规了,本能用加号,所以要一直递归,直到进位信息为零

那a-b=add(a,add(~b+1)),a+(-b)

乘法

a*b,从右往左看b的二进制位,是1把a抄下来,是0不抄下来,a后面补一个零(左移1位),循环

除法

1.要用右移,左移会导致数据符号位改变

2.x右移i位,i=30.29...5,x<y说明第i位上要放0,x>>4,x>=y停,第四位 置1,然后当前的x-y即x-y<<4

3.如何回避掉系统最小值无法转成绝对值问题,举例假设系统最小值是-15我要计算-15/3

-15+1=-14,-14/3=-4,然后(-15)-(-4*3)计算差值得-3,然后-3/3得到-1把他和-4相加

a/b->        (a+1)/b=c  ->a-(b*c)=d  ->  d/b=e  ->c+e

 

package class05;// 测试链接:https://leetcode.com/problems/divide-two-integers
public class Code03_BitAddMinusMultiDiv {public static int add(int a, int b) {int sum = a;while (b != 0) {//无论如何不能用加号sum = a ^ b;//无进位相加信息b = (a & b) << 1;//进位信息b->b`a = sum;//a->a`,直到进位信息为零}return sum;}public static int negNum(int n) {return add(~n, 1);}public static int minus(int a, int b) {return add(a, negNum(b));}
//乘法public static int multi(int a, int b) {int res = 0;while (b != 0) {if ((b & 1) != 0) {//最末尾有1res = add(res, a);//接受此时的a}a <<= 1;//a后面补一个零b >>>= 1;//循环的步进条件}return res;}public static boolean isNeg(int n) {return n < 0;}public static int div(int a, int b) {int x = isNeg(a) ? negNum(a) : a;//先把ab设置成正数int y = isNeg(b) ? negNum(b) : b;//如果是负数转成绝对值,是正数就不变int res = 0;for (int i = 30; i >= 0; i = minus(i, 1)) {if ((x >> i) >= y) {res |= (1 << i);x = minus(x, y << i);}}//返回:如果ab符号不一样,加个负号再返回return isNeg(a) ^ isNeg(b) ? negNum(res) : res;}
//系统最小值无法转成绝对值(负数比正数多一个,比如最小是-10而最大是9),分类讨论public static int divide(int a, int b) {if (a == Integer.MIN_VALUE && b == Integer.MIN_VALUE) {return 1;} else if (b == Integer.MIN_VALUE) {return 0;} else if (a == Integer.MIN_VALUE) {if (b == negNum(1)) {//这个数不存在没有,约定俗成写最大值return Integer.MAX_VALUE;} else {int c = div(add(a, 1), b);return add(c, div(minus(a, multi(c, b)), b));}} else {return div(a, b);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式linux面试题目总结

Linux系统中常见的面试题目&#xff0c;分享&#xff0c;欢迎大家前来交流学习。 1、嵌入式系统中的CAN通信协议是什么&#xff1f; CAN&#xff08;Controller Area Network&#xff09;通信协议是一种广泛应用于嵌入式系统中的串行通信协议。它最初由德国汽车工业联合会开发…

mysql升级5.X到mysql8关键字问题

数据库系统升级&#xff0c;要注意很多东西&#xff0c;5.x版本升级到mysql8&#xff0c;是一次大的版本升级&#xff0c;因此要注意诸多事项. charset更新 关键字 一些在5.x版本没有问题的字段&#xff0c;在mysql8中会触发关键字. 例如&#xff1a; rank&#xff0c;在mys…

VS如何打包环境

以VS2005为例子,做好的软件需要发给客户现场升级,有时候总是因为系统,环境变量不同导致软件不能正常运行打开,这也是程序员非常头疼的问题,今天我们就一起看下打包环境变量. 这样我们的环境变量就打包到setup中了,目标机台安装即可!!!

新概念英语第二册(43)上

【New words and expressions】生词和短语&#xff08;13&#xff09; pole n.&#xff08;地球的&#xff09;极 flight n. 飞行 explorer n. 探险家 lie …

[Python] numpy - 如何对数组进行降维或者升维

什么是数组升维&#xff1f; 数组升维是指将原本低维数组转换为更高维的数组的操作。在编程中&#xff0c;数组是一种存储多个相同类型数据的连续内存空间。升维操作可以通过添加额外的维度来增加数组的维数。 举个例子&#xff0c;将一个一维数组升维为二维数组可以使用resh…

Java集合-Map接口(key-value)

Map接口的特点&#xff1a;①KV键值对方式存储②Key键唯一&#xff0c;Value允许重复③无序。 Map有四个实现类&#xff1a;1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类 1.HashMap类&#xff1a; 存储结构&#xff1a;哈希表 数组Node[ ] 链表&#xff08;红黑…

在windows环境下安装hadoop

Hadoop是一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。但这个架构是基于java语言开发的&#xff0c;所以要先进行jdk的安装&#xff0c;如果电脑已经配置过jdk或者是曾经运行成功过java文件&#xff0c;那就可以跳过第一步。 …

想用verilog写一个npu 需要什么学习路线?

要用Verilog编写一个NPU&#xff08;神经处理单元&#xff09;&#xff0c;你需要经过以下学习路线&#xff1a; 数字电路基础&#xff1a; 学习数字电路的基本概念&#xff0c;包括逻辑门、寄存器、时钟信号、信号传输等。 Verilog编程语言&#xff1a; 学习Verilog HDL&…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

【随谈】为什么高端开发岗要求研究过源码?如何研究?

今天来聊一个简单的问题&#xff1a;研究源码有什么用&#xff1f; 不知道你是否注意过&#xff0c;如果找薪资3万以上的岗位&#xff0c;往往都要求研究过框架和中间件源码的优先考虑。 我们随便选几个例子&#xff1a; 这里条件虽然写了很多&#xff0c;但是最重要的都是要…

编程笔记 html5cssjs 063 JavaScrip输出

编程笔记 html5&css&js 063 JavaScrip输出 一、JavaScript 输出方式二、弹出警告框来显示数据三、操作 HTML 元素四、写到 HTML 文档五 、写到控制台小结 JavaScript 输出。JavaScript 没有任何打印或者输出的函数。JavaScript输出主要是显示数据&#xff0c;以使我们看…

Hadoop集群部署流程

前置要求 需要3台虚拟机&#xff0c;系统为Centos7&#xff0c;分别host命名为node1&#xff0c;node2&#xff0c;node3&#xff0c;密码均为root请确保这三台虚拟机已经完成了JDK、SSH免密、关闭防火墙、配置主机名映射等前置操作 在3台虚拟机的/etc/hosts文件中&#xff0…

Java Card调试系统

近年来,嵌入式系统发展迅猛,已经广泛的渗透到了人们日常生活的方方面面中。由于市场对嵌入式系统要求越来越细致深入,致使其开发也越来越复杂。市场日益激烈的竞争趋势致使对嵌入式系统开发周期的要求不断提高,这时支撑软件高效开发的嵌入式开发工具特别是调试工具就显得至关重…

【Docker】快速入门手册

目录 1.概述 1.1.安装 1.2.阿里云镜像加速 1.3.运行原理 2.常用操作 2.1.帮助命令 2.2.镜像操作 2.3.容器操作 2.3.1创建、启动 2.3.2.退出、停止 2.3.3.进入交互式界面 2.3.4.守护式容器交互 2.3.5.查看 2.3.6.删除 2.3.7.拷贝 3.容器数据卷 3.1.概述 3.2.使…

网页转文件下载工具

为了更快捷copy博客 做了个 网页转文件下载工具 1.0.1 更新如下&#xff1a; javaphpjava提供页面转换文件的微服务APIphp调用接口&#xff0c;输出文件下载支持网页转md 1.0.2 更新如下&#xff1a; 样式表切换&#xff0c;白天or黑夜&#xff0c;cookie七天保质期 未…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步&#xff1a;全局安装&#xff1a;npm install -g create-react-app 第二步&#xff1a;切换到想创建项目的目录&#xff0c;使用命令create-react-app hello-react 第三步&#xff1a;进入项目目录&#xff0c;cd hello-react 第四步&#xff1a;启…

Java技术栈 —— Hadoop入门(二)

Java技术栈 —— Hadoop入门&#xff08;二&#xff09; 一、用MapReduce对统计单词个数1.1 项目流程1.2 可能遇到的问题1.3 代码勘误1.4 总结 一、用MapReduce对统计单词个数 1.1 项目流程 (1) 上传jar包。 (2) 上传words.txt文件。 (3) 用hadoop执行jar包的代码&#xff0c;…

RNN预测下一句文本简单示例

根据句子前半句的内容推理出后半部分的内容&#xff0c;这样的任务可以使用循环的方式来实现。 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种用于处理序列数据的强大神经网络模型。与传统的前馈神经网络不同&#xff0c;RNN能够通过其…

第十二届“中关村青联杯”全国研究生数学建模竞赛-D题:面向节能的单/多列车优化决策问题(续)

目录 5.3 240 列列车节能运行优化控制模型 5.3.1 模型描述 5.3.2 模型求解 6 问题三分析

32GPIO输入LED闪烁蜂鸣器

一.GPIO简介 所有的GPIO都挂载到APB2上&#xff0c;每个GPIO有&#xff11;&#xff16;个引脚 内核可以通过APB&#xff12;对寄存器进行读写&#xff0c;寄存器都是32位的&#xff0c;但每个引脚端口只有&#xff11;&#xff16;位 驱动器用于增加信号的驱动能力 二.具体…