算法-2-异或运算

按位异或:相同为0,不同为1

异或运算性质

1)异或运算就是无进位相加(a+b写二进制形式每位相加时不进位

2)异或运算满足交换律、结合律,也就是同一批数字,不管异或顺序是什么,最终的结果都是一个

3)0^n=n,n^n=0(原来是0还是0,原来是1无进位想加还是0

4)整体异或和如果是x,整体中某个部分的异或和如果是y,那么剩下部分的异或和是x^y

应用:不借助中间变量交换ab的值

a=a^b;
b=a^b;
a=a^b;

弊端:尤其进行数组下标交换时,要保证指针(位置不能相同),指向的数的值可以相同

arr[i]=i^j;arr[j]=i^j;arr[i]=i^j;        前提i!=j

数组中1种数出现了奇数次,其他的数都出现了偶数次,返回出现了奇数次的数

出现了偶数次的数与eor异或结果还是eor

怎么把一个int类型的数,提取出最右侧的1来

~a:把a打散,盯着最右侧的1,1自身变0左右两侧均取反

~a+1,最右侧的1左边的数字没变,右边使得盯着的1由还原

~a+1=-a

数组中有2种数出现了奇数次,其他的数都出现了偶数次,找到并打印这两种数

public class Code02_EvenTimesOddTimes {// arr中,只有一种数,出现奇数次public static void printOddTimesNum1(int[] arr) {int eor = 0;for (int i = 0; i < arr.length; i++) {eor ^= arr[i];}System.out.println(eor);}// arr中,有两种数,出现奇数次public static void printOddTimesNum2(int[] arr) {int eor = 0;for (int i = 0; i < arr.length; i++) {eor ^= arr[i];}// a 和 b是两种数// eor != 0// eor最右侧的1,提取出来// eor :     00110010110111000// rightOne :00000000000001000int rightOne = eor & (-eor); // 提取出最右的1int onlyOne = 0; // eor'for (int i = 0 ; i < arr.length;i++) {//  arr[1] =  111100011110000// rightOne=  000000000010000if ((arr[i] & rightOne) != 0) {onlyOne ^= arr[i];}}System.out.println(onlyOne + " " + (eor ^ onlyOne));}public static int bit1counts(int N) {int count = 0;//   011011010000//   000000010000     1//   011011000000// while(N != 0) {int rightOne = N & ((~N) + 1);count++;N ^= rightOne;// N -= rightOne}return count;}public static void main(String[] args) {int a = 5;int b = 7;a = a ^ b;b = a ^ b;a = a ^ b;System.out.println(a);System.out.println(b);int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };printOddTimesNum1(arr1);int[] arr2 = { 4, 3, 4, 2, 2, 2, 4, 1, 1, 1, 3, 3, 1, 1, 1, 4, 2, 2 };printOddTimesNum2(arr2);}}

假设a,b这两个数出现了奇数次,拿eor^整个数组,得到eor=a^b,而a!=b说明eor!=0,说明eor某一位必然有1,不妨取最右边的1,然后根据这个1对原数组进行分类,一类这一位上有1,另一类没有,假设a这一位上有1,b没有,定义eor·异或上a所在的那一类,那一类只有a出现了奇数次所以eor·=a,然后eor·在异或eor得到b

一个数组中有一种数出现了k次,其他数字都出现了m次,m>1,k<m,找到出现了k次的数

package class02;import java.util.HashMap;
import java.util.HashSet;public class Code03_KM {public static int test(int[] arr, int k, int m) {HashMap<Integer, Integer> map = new HashMap<>();for (int num : arr) {if (map.containsKey(num)) {map.put(num, map.get(num) + 1);} else {map.put(num, 1);}}for (int num : map.keySet()) {if (map.get(num) == k) {return num;}}return -1;}public static HashMap<Integer, Integer> map = new HashMap<>();// 请保证arr中,只有一种数出现了K次,其他数都出现了M次public static int onlyKTimes(int[] arr, int k, int m) {if (map.size() == 0) {mapCreater(map);}int[] t = new int[32];// t[0] 0位置的1出现了几个// t[i] i位置的1出现了几个for (int num : arr) {while (num != 0) {int rightOne = num & (-num);t[map.get(rightOne)]++;num ^= rightOne;}}int ans = 0;for (int i = 0; i < 32; i++) {if (t[i] % m != 0) {if (t[i] % m == k) {ans |= (1 << i);} else {return -1;}}}if (ans == 0) {int count = 0;for (int num : arr) {if (num == 0) {count++;}}if (count != k) {return -1;}}return ans;}public static void mapCreater(HashMap<Integer, Integer> map) {int value = 1;for (int i = 0; i < 32; i++) {map.put(value, i);value <<= 1;}}public static int[] randomArray(int maxKinds, int range, int k, int m) {int ktimeNum = randomNumber(range);// 真命天子出现的次数int times = Math.random() < 0.5 ? k : ((int) (Math.random() * (m - 1)) + 1);// 2int numKinds = (int) (Math.random() * maxKinds) + 2;// k * 1 + (numKinds - 1) * mint[] arr = new int[times + (numKinds - 1) * m];int index = 0;for (; index < times; index++) {arr[index] = ktimeNum;}numKinds--;HashSet<Integer> set = new HashSet<>();set.add(ktimeNum);while (numKinds != 0) {int curNum = 0;do {curNum = randomNumber(range);} while (set.contains(curNum));set.add(curNum);numKinds--;for (int i = 0; i < m; i++) {arr[index++] = curNum;}}// arr 填好了for (int i = 0; i < arr.length; i++) {// i 位置的数,我想随机和j位置的数做交换int j = (int) (Math.random() * arr.length);// 0 ~ N-1int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}return arr;}// [-range, +range]public static int randomNumber(int range) {return ((int) (Math.random() * range) + 1) - ((int) (Math.random() * range) + 1);}public static void main(String[] args) {int kinds = 5;int range = 30;int testTime = 100000;int max = 9;System.out.println("测试开始");for (int i = 0; i < testTime; i++) {int a = (int) (Math.random() * max) + 1; // a 1 ~ 9int b = (int) (Math.random() * max) + 1; // b 1 ~ 9int k = Math.min(a, b);int m = Math.max(a, b);// k < mif (k == m) {m++;}int[] arr = randomArray(kinds, range, k, m);int ans1 = test(arr, k, m);int ans2 = onlyKTimes(arr, k, m);if (ans1 != ans2) {System.out.println(ans1);System.out.println(ans2);System.out.println("出错了!");}}System.out.println("测试结束");}}

 

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

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

相关文章

【Spring连载】使用Spring Data访问Redis(七)----Hash Mapping

【Spring连载】使用Spring Data访问Redis&#xff08;七&#xff09;----Hash Mapping 一、Hash Mappers二、Jackson2HashMapper 你可以使用Redis中的各种数据结构来存储数据。Jackson2JsonRedisSerializer可以转换JSON格式的对象。理想情况下&#xff0c;通过使用plain键&…

Stable Diffusion 模型下载:majicMIX lux 麦橘辉耀 - V3

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 非常推荐的一个非常绚丽的科幻、梦幻、玄幻般的大模型&#xff0c;由国人“Merjic”发布&#xff0c;下载量颇高。这个模型风格炸裂&#xff0c;远距离脸部需要inp…

071:vue中过滤器filters的使用方法(图文示例)

第071个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

Java接口与抽象类

接口 定义 Java中的接口是一种抽象类型&#xff0c;用于定义一组规范或行为。接口允许我们定义一组方法&#xff0c;这些方法没有具体的实现&#xff0c;而是由实现接口的类来提供具体的实现。 语法&#xff1a;接口的声明使用interface关键字&#xff0c;后面跟上接口的名称…

gem5学习(17):ARM功耗建模——ARM Power Modelling

目录 一、Dynamic Power States 二、Power Usage Types 三、MathExprPowerModels 四、Extending an existing simulation 五、Stat dump frequency 六、Common Problems 官网教程&#xff1a;gem5: ARM Power Modelling 通过使用gem5中已记录的各种统计数据&#xff0c;…

ag-Grid:对数据变化的单元格进行高亮显示

问:ag-grid 当 rowData 数据变化,如何对数据变化的党员个进行高亮? 解析: 在ag-Grid中,想要对数据变化的单元格进行高亮显示,你可以使用以下步骤来实现: 监听数据变化:首先,你需要监听rowData的变化。这可以通过在你的组件中观察rowData属性的变化来实现,或者如果你…

复杂docker 问题一

一、如何清理无用的Docker镜像和容器&#xff1f; 在使用Docker的过程中&#xff0c;随着时间的推移&#xff0c;系统中可能会积累很多不再使用或过时的镜像、停止的容器、无用的数据卷和网络等&#xff0c;这些资源占用了磁盘空间并可能导致性能下降。因此&#xff0c;定期清…

go 切面 AOP 实现

go AOP 实现 使用Go语言的反射机制和函数类型实现AOP&#xff0c;通过在需要切入的函数前后添加额外的逻辑代码实现AOP package mainimport ("errors""fmt""log""reflect" )// User 结构体表示一个用户 type User struct {ID intN…

《动手学深度学习(PyTorch版)》笔记7.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

闲聊电脑(5)装个 Windows(一)

​夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次说到硬盘分区和格式化&#xff0c;弄完之后&#xff0c;就该装系统了吧&#xff1f; 冰箱&#x…

Web课程学习笔记--CSS选择器的分类

CSS 选择器的分类 基本规则 通过 CSS 可以向文档中的一组元素类型应用某些规则 利用 CSS&#xff0c;可以创建易于修改和编辑的规则&#xff0c;且能很容易地将其应用到定义的所有文本元素 规则结构 每个规则都有两个基本部分&#xff1a;选择器和声明块&#xff1b;声明块由一…

算法:最小循环子数组

一、算法描述 给定一个由若干整数组成的数组nums&#xff0c;请检查数组是否是由某个子数组重复循环拼接而成&#xff0c;请输出这个最小的子数组。 输入描述 第一行输入数组中元素个数n&#xff0c;1 < n < 100000 第二行输入数组的数字序列nums&#xff0c;以空格分割&…

力扣(leetcode)第448题找到所有数组中消失的数字(Python)

448.找到数组中消失的数字 题目链接&#xff1a;448.找到数组中消失的数字 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; …

JVM性能调优 - 服务器性能排查(7)

在排查生产环境的性能问题时,以下是一些常见的步骤和技巧: 监控系统资源:使用系统监控工具(如top、htop、nmon等)来监控服务器的CPU使用率、内存使用率、磁盘IO等系统资源情况。这可以帮助你了解系统的整体负载情况,是否存在资源瓶颈。 分析日志:查看应用程序的日志文件…

Docker安装ElasticSearch/ES 7.10.0

目录 前言安装ElasticSearch/ES安装步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 安装步骤2&#xff1a;拉取ElasticSearch镜像1 拉取镜像2 查看已拉取的镜像 安装步骤3&#xff1a;创建容器创建容器方…

【Rust】字符串,看这篇就够了

这节课我们把字符串单独拿出来讲&#xff0c;是因为字符串太常见了&#xff0c;甚至有些应用的主要工作就是处理字符串。比如 Web 开发、解析器等。而 Rust 里的字符串内容相比于其他语言来说还要多一些。是否熟练掌握 Rust 的字符串的使用&#xff0c;对 Rust 代码开发效率有很…

2月05日,每日信息差

第一、全球首套5G及6G天地一体网络低轨试验卫星发射入轨、。据了解&#xff0c;“中国移动01星”是全球首颗可验证5G天地一体演进技术的试验卫星&#xff0c;它搭载的基站可以利用卫星的广覆盖优势把5G信号传送到地面网络无法覆盖到的地方&#xff1b;另外一颗“‘星核’验证星…

基于OpenCV灰度图像转GCode的单向扫描实现

基于OpenCV灰度图像转GCode的单向扫描实现 引言单向扫描存在的问题灰度图像单向扫描代码示例结论 系列文章 ⭐深入理解G0和G1指令&#xff1a;C中的实现与激光雕刻应用⭐基于二值化图像转GCode的单向扫描实现⭐基于二值化图像转GCode的双向扫描实现⭐基于二值化图像转GCode的…

安装newman显示required node version >=16解决办法

直接安装对应版本就行&#xff0c;我的Node.js是14.16.0的版本&#xff0c;newman安装5.2.2的就不会出错。 npm install -g newman5.2.2

linux centos安装neofetch

简介 neofetch是一个命令行工具&#xff0c;可以用来显示系统的基本信息和硬件配置。它支持多种操作系统&#xff0c;包括Linux、macOS和Windows等。 安装 增加yum源 curl -o /etc/yum.repos.d/konimex-neofetch-epel-7.repo https://copr.fedorainfracloud.org/coprs/konime…