算法学习笔记(十):位运算、数论等

一.位运算基础

集合与集合之间的位运算

集合和元素

常用函数

        

1.使两个整数相等的位更改次数

        给你两个正帧数 n 和 k,你可以选择 n 的二进制表示 中任意一个值为 1 的位,

        并将其改为0,返回使得 n 等于 k 所需要的更改次数,如无法实现,返回 -1

class Solution {public int minChanges(int n, int k) {//怎么能这么牛逼,如果是这种题 可以将n和k都换算成二进制数组//然后如果k不是n的子集 那么就是-1 是子集的话就去掉交集之后数组的长度就是需要操作的次数//二进制数组取交集 就是 & 运算算//java算二进制数组的长度有工具类 Integer.bitCount//取数组差集  子集就是 ^运算//答案为从 n 中去掉 k 后的集合大小,即 n^k 的二进制中的 1 的个数return (n & k) != k ? -1 : Integer.bitCount(n ^ k);}
}

  2.根据数字二进制下 1 的数目排序

        给你一个整数数组 arr,请你将数组中的元素按照其二进制表示中数字 1 的数目进行升序

        如果存在多个数字二进制中1的数目相同,则必须按照它们原数值大小升序排序

        请你返回排序后的数组

class Solution {public int[] sortByBits(int[] arr) {//脑子不好使 确实,因为元素的大小是< 10^4 //那么为了保证相同前提下用原元素大小来作为比较//可以用结果*100000(防止数据冲突) + 原始数据//这样在相同情况下原始数据大的肯定在前面//主要还是本题是返回排序后的数组//所以最后再%=100000jiu haolfor (int i = 0; i < arr.length; i ++) {arr[i] += Integer.bitCount(arr[i]) * 100000;}Arrays.sort(arr);for (int i = 0; i < arr.length; i++) {arr[i] %= 100000;}   return arr;}
}

3.汉明距离

        两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目

        给你两个整数 x 和 y,计算并返回他们之间的汉明距离

class Solution {public int hammingDistance(int x, int y) {//是不是取对称差?// return Integer.bitCount( x ^ y);//用右移实现 每次取不同偏移位的二进制位 不同+1int count = 0;for (int i = 0; i < 32; i++) {//&运算相当于是取最右地位的二进制位数 因为&1=本身int a = (x >> i) & 1;int b = (y >> i) & 1;//^运算是相同为0,不同为1 那么如果是不同直接+1count += (a ^ b);}return count;}
}

4.转换数字的最少位翻转次数

        一次 位翻转 定义为将数字 x 二进制中的一个位进行 翻转操作,即将 0-->1,1 -->0

        比方说,x = 7,二进制表示为 111,我们可以选择任意一个位(包含没有显示的前导0)

        并进行翻转,比方说我们可以翻转最右边一位得到110,或者翻转右边起第二位得到101,

        获取翻转右边起第五位(这一位是前导0)得到10111等等操作

        给你两个整数start 和 goal,请你返回将 start 转变为 goal 的最少位翻转次数

class Solution {public int minBitFlips(int start, int goal) {//这一题应该是根上一题一样,求两个数之间二进制位不相同的个数//方法一 直接用Java api计算两个数的子集二进制数个数// return Integer.bitCount(start ^ goal);//方法二 还是用右移偏移位来计算每个位置的不同int count = 0;for (int i = 0; i < 32; i++) {int x = (start >> i) & 1;int y = (goal >> i) & 1;count += (x ^ y);}return count;}
}

二.异或 XOR (^)

亦或的性质:

        - 相同异或为0,不同为1

        - 任意数值与0异或,结果为数值本身

        - 异或本身满足交换律,比如:

                a = b ^ c ,

                a ^ c = b ^ c ^ c

                a ^ c = b ^ 0

                a ^ c = b

1.数组亦或操作

        给你两个整数 n 和 start

        数组 nums 定义为:nums[i] = start + 2 * i(下标从0开始),且 n == nums.length

        请返回 nums中所有元素按位异或后得到的结果

class Solution {public int xorOperation(int n, int start) {int[] ans = new int[n];for (int i = 0; i < n; i++) {ans[i] = start + 2 * i;}int num = 0;for (int x : ans) {num ^= x;}return num;}
}

2.解码亦或后的数组

        未知整数素组 arr由 n个非负整数组成

        经编码后变为长度为 n - 1 的另一个整数数组encoded,其中encoded[i] = arr[i] ^ arr[i + 1]

        例如:arr = [1, 0 , 2, 1]编码后得到encoded = [1, 2, 3];

        给你编码后的数组 encoded 和原数组arr的第一个元素 first

        请解码返回原数组 arr,可以证明答案唯一并存在

class Solution {public int[] decode(int[] encoded, int first) {int len = encoded.length + 1;int[] arr = new int[len];/**由题目可知encoded[i] = arr[i] ^ arr[i + 1]那么根据异或性质可知encoded[i - 1] = arr[i - 1] ^ arr[i]encoded[i - 1] ^ arr[i - 1] = arr[i - 1] ^ arr[i] ^ arr[i - 1]encoded[i - 1] ^ arr[i - 1] = arr[i];所以arr[i] = arr[i - 1] ^ encoded[i - 1]*/arr[0] = first;for (int i = 1; i < len; i++) {arr[i] = arr[i - 1] ^ encoded[i - 1];}return arr;}
}

3.找出前缀异或的原始数组

        给你一个长度为 n 的整数数组 pref,找出并返回满足下述条件且长度为 n 的数组 arr

        pref[i] = arr[0] ^ arr[1] ^ arr[2] ^ ..... ^ arr[i]

        可以保证答案唯一

class Solution {public int[] findArray(int[] pref) {/**根据异或性质pref[0] = arr[0]pref[1] = arr[0] ^ arr[1]pref[1] ^ arr[0] = arr[0] ^ arr[1] ^ arr[0] = arr[1]那么pref[2]  = arr[0] ^ arr[1] ^ arr[2]pref[2] ^ arr[0] = arr[1] ^ arr[2]pref[2] ^ arr[0] ^ arr[1] = arr[2]而arr[0] ^ arr[1] 是=pref[1]的由上面可知所以pref[2] ^ pref[1] = arr[2]所以arr[0] = pref[0]arr[1] = pref[1] ^ arr[0] = pref[1] ^ pref[0]arr[i] = pref[i] ^ pref[i - 1]*/int[] arr = new int[pref.length];arr[0] = pref[0];for (int i = 1; i < pref.length; i++) {arr[i] = pref[i] ^ pref[i - 1];}return arr;}
}

4.只出现一次的数字

        给你一个非空整数数组 nums,除了某个元素只出现一次外,其余每个元素均出席那两次

        找出那个只出现一次的元素

        你必须设计并实现线性时间复杂度的算法来解决此问题,且只使用常量额外空间

class Solution {public int singleNumber(int[] nums) {// ^运算 /**2 ^ 2 ^1 = (2 ^ 2) ^ 1 = 14 ^ 1 ^ 2 ^ 1 ^ 2 = 4 ^ (1 ^ 1) ^ (2 ^ 2) = 4 ^ 0 ^ 0 = 4直接用异或就是了 因为根据异或的性质 异或本身 = 0*/int ans = 0;for (int num : nums) {ans ^= num;}return ans;//用哈希咯?// Map<Integer, Integer> map = new HashMap<>();// //额外常量空间 那么就还可以用二进制来表示了 // // // for (int i = 0; i < nums.length; i++) {//     int num = map.getOrDefault(nums[i], 0) + 1;//     map.put(nums[i], num);// }// for (int key : map.keySet()) {//     if (map.get(key) == 1) return key;// }// return -1;}
}

  三. 与或(&、|)

&的数越多,结果越小,|的数越多,结果越大

&:遇0则0

|:遇1则1

1.    检查按位或是否存在尾随零

        给你一个正整数数组nums

        你需要检查是否可以从数组中选出两个或更多元素,满足这些元素的按位或运算结果的二进

        制表示中至少存在一个尾随零

        例如:数字5的二进制表示为101,不存在尾随零,数字4是100,存在两个尾随零

        如果可以选择两个或更多元素,其按位或运算结果存在尾随零,返回true,否则返回false

class Solution {public boolean hasTrailingZeros(int[] nums) {//草 真牛逼 | 是遇1则1 尾随0 那么最低为如果要为0则肯定不能是1//也就是说不能是奇数,因为奇数的最低位肯定是1 那么|的结果肯定最低位都是1//所以要用用& 如果存在尾随0,那么结果肯定=0//也就是说只要找出有两个及以上的偶数就满足int count = 0;for (int num : nums) {if ((num & 1) == 0) count++;}return count >= 2;}
}

4.其他

1.质数的最大距离

        给你一个整数数组nums

        返回两个(不一定不同的)质数在nums中下标的最大距离

class Solution {public int maximumPrimeDifference(int[] nums) {//质数是只能被1和本身整除,在一定范围内 如果能被10以内的某个数整除(1除外)这个就不就是质数 反之就是质数//所以写一个判断质数的方法 //然后一个从前遍历 找到第一个质数 一个从后遍历找到最后一个质数//两者下标就是最大距离int i = 0;while (!isPrime(nums[i])) {i++;}int j = nums.length - 1;while (!isPrime(nums[j])) {j--;}return j - i;}private boolean isPrime(int n) {for (int i = 2; i * i <= n; i++) {if (n % i == 0) return false;}return n >= 2;}
}

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

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

相关文章

恋爱通信史之完整性

在前面的章节中&#xff0c;介绍了对通信消息的加密&#xff0c;可以保证保密性(机密性)。虽说中间人无法解密通信消息的内容&#xff0c;但是可以篡改通信的消息。在接受者视角来看&#xff0c;是无法识别通信消息是否被篡改。因此&#xff0c;必须引入一种机制&#xff0c;保…

数据结构第一讲

数据结构定义 算法的定义 什么是好算法&#xff1f; 空间复杂度 时间复杂度 例子1 打印1到N之间的正整数 有递归和循环两种方法实现。 但是在数字变大后&#xff0c;递归的方法会导致内存占用过多而崩溃。 而循环则不会 例子2 写程序给定多项式在X处的值 从里往外算的算…

安卓应用安装过程学习

声明&#xff1a;此文章来自http://shuwoom.com/?p60的学习记录 启动式安装 public static final IPackageManager main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {PackageManagerService m new PackageManagerService(context, inst…

输入/输出管理 III(磁盘和固态硬盘)

一、磁盘 【总结】&#xff1a; 磁盘&#xff08;Disk&#xff09;是由表面涂有磁性物质的物理盘片&#xff0c;通过一个称为磁头的导体线圈从磁盘存取数据。在读&#xff0f;写操作期间&#xff0c;磁头固定&#xff0c;磁盘在下面高速旋转。如下图所示&#xff1a; 磁盘盘面…

使用flink编写WordCount

1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 流程图&#xff1a; DataStream API开发 //nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/datastream/overview/ 添加依赖 <properties>&l…

# issue 4 进程控制函数

目录 一、进程控制函数一 二、进程控制函数二 启动进程&#xff1a;&#xff08;exec系列&#xff09; 创建新进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 三、进程控制函数三 结束进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 四、…

Java项目实战II基于SpringBoot的共享单车管理系统开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在共享经济蓬勃发展的今天…

Linux 网络编程之UDP套接字

前言 前面我们对网络的发展&#xff0c;网络的协议、网路传输的流程做了介绍&#xff0c;最后&#xff0c;我们还介绍了 IP 和 端口号&#xff0c;ip port 叫做 套接字 socket&#xff0c; 本期我们就来介绍UDP套接字编程&#xff01; 目录 1、预备知识 1.1 传输层协议: T…

---Arrays类

一 java 1.Arrays类 1.1 toString&#xff08;&#xff09; 1.2 arrays.sort( )-----sort排序 1&#xff09;直接调用sort&#xff08;&#xff09; Arrays.sort() 方法的默认排序顺序是 从小到大&#xff08;升序&#xff09;。 2&#xff09;定制排序【具体使用时 调整正负…

Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化

1. 对象在内存中的布局分为三块区域&#xff1a; &#xff08;1&#xff09;对象头&#xff08;Mark Word、元数据指针和数组长度&#xff09; 对象头&#xff1a;在32位虚拟机中&#xff0c;1个机器码等于4字节&#xff0c;也就是32bit&#xff0c;在64位虚拟机中&#xff0…

6.7机器学习期末复习题

空间 样本空间 就是属性的所有可能情况&#xff0c;包括了一切可能出现或不可能出现的所有样本情况 版本空间&假设空间 假设空间就是在样本空间的基础上&#xff0c;给所有属性都加了一个通配符&#xff0c;表示任意即可&#xff1b;以及加上了一个空集&#xff0c;表示…

Qt界面设计时使各控件依据窗口缩放进行栅格布局的方法

图1 最终效果 想要达成上述图片的布局效果&#xff0c;具体操作如下&#xff1a; 新建一窗体&#xff1a; 所需控件如下&#xff1a; Table View控件一个&#xff1b; Group Box控件一个&#xff1b; Push Button控件2个&#xff1b; Horiziontal Spacer控件2个&#xf…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令&#xff1a;brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

数据结构C语言描述5(图文结合)--队列,数组、链式、优先队列的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

一篇文章了解机器学习

一篇文章了解机器学习&#xff08;上&#xff09; 一、软件版本安装二、数据集的加载三、数据集的切分四、数据特征提取及标准化1、字典数据的特征提取2、文本特征向量的提取3、数据标准化处理 四、特征降维注&#xff1a;训练器的区别&#xff1a;&#xff1a;五、模型的训练与…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…

Hello-Go

Hello-Go 环境变量 GOPATH 和 GOROOT &#xff1a;不同于其他语言&#xff0c;go中没有项目的说法&#xff0c;只有包&#xff0c;其中有两个重要的路径&#xff0c;GOROOT 和 GOPATH Go开发相关的环境变量如下&#xff1a; GOROOT&#xff1a;GOROOT就是Go的安装目录&…

pytorch官方FasterRCNN代码详解

本博文转自捋一捋pytorch官方FasterRCNN代码 - 知乎 (zhihu.com)&#xff0c;增加了其中代码的更详细的解读&#xff0c;以帮助自己理解该代码。 代码理解的参考Faster-RCNN全面解读(手把手带你分析代码实现)---前向传播部分_手把手faster rcnn-CSDN博客 1. 代码结构 作为 to…

全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发

8、RTOS系统定制开发 此处以在rtos/components/aw目录下创建一个简单的软件包为例&#xff0c;帮助客户了解RTOS环境&#xff0c;为RTOS系统定制开发提供基础。 RTOS环境下的软件包主要由三部分组成&#xff0c;源文件&#xff0c;Makefile&#xff0c;Kconfig&#xff0c;如下…

springboot实战(13)(@PatchMapping、@RequestParam、@URL、ThreadLocal线程局部变量)

目录 一、PATCH请求方式。 二、实现用户更新头像功能。 三、注解RequestParam。 四、注解URL。&#xff08;对传来的参数是否是合法地址进行校验&#xff09; 一、PATCH请求方式。 patch中文翻译&#xff1a;局部、小块。PATCH 请求主要用于对已存在的资源进行局部修改&#xf…