【C刷题笔记】找单身狗问题

news2025/1/4 15:33:26

目录

版本1:在数组内只有一个元素没有成对出现

版本2:在数组内有两个元素没有成对出现

第一步:异或所有元素,异或就是相同为0,相异为1

第二步:计算ret的二进制中哪一位元素是1

第三步:开始分组异或

1.分组:

2.异或


版本1:在数组内只有一个元素没有成对出现

单身狗
只有一个数字出现一次,其他数数字都是成对出现的,找出只出现一次的数字
1 2 3 4 5 1 2 3 4 

分析:
所有的数字异或在一起,异或的规则:
1.a^a=0 -->任何数异或本身等于0

2.a^0=a -->任何数异或0等于任何数

也就是说此数组的所有元素(除了5)异或之后就为0,再和5异或,最终结果就是5

找单身狗问题:

#include<stdio.h>
int single_num(int* nums, int sz)
{
	int x = 0;
	for (int i = 0; i < sz; i++)
	{
		x ^= nums[i];
	}
	return x;
}
int main()
{
	int nums[] = { 1,2,3,4, 5, 1, 2, 3 ,4 };
	int sz = sizeof(nums) / sizeof(nums[0]);
	int ret = single_num(nums, sz);
	printf("单身狗数字为:%d", ret);
}

执行: 

版本2:在数组内有两个元素没有成对出现

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6

分析:

此版本的单身狗是在一个数组内一次找两个单身狗(没有成对出现的),就比如上面的,5,6都是没有第二个相同的数

由版本一,分析可知相同元素相异或就为0,0和5,6异或之后肯定不为0,下面图解:

第一步:异或所有元素,异或就是相同为0,相异为1

 第二步:计算ret的二进制中哪一位元素是1

 

以此类推,用一个for循环遍历32bit位:(ret>>i)与i相按位与,找到所有1所在的位置,也就是用pos表示。

第三步:开始分组异或

1.分组:

这是倒数第一位bit位为1的情况:

 这是倒数第一位bit位为0的情况:

 

 这是倒数第二位bit位为1的情况:

  这是倒数第二位bit位为0的情况:

2.异或

bit位最低位:

x: 最低位是1的数字:1 1 3 3 5 -->x^arr[i]所有元素,只剩5^0=5
y: 最低位是0的数字:2 2 4 4 6-->y^arr[i]所有元素,只剩6^0= 6

接着返回到主函数,找到两个单身狗x  y:5  6  🐶🐶

bit倒数第二位:

x:倒数第二位是1的数字:6 2 2 3 3-->x^arr[i]所有元素,只剩6^0=6
y: 倒数第二位是0的数字:1 1 4 4 5-->y^arr[i]所有元素,只剩5^0=5

接着返回到主函数,找到两个单身狗x  y:6  5  🐶🐶

实例代码:

#include<stdio.h>
void find_single_dog(int* arr, int sz, int* x, int* y)
{
	int i = 0;
	int ret = 0;
	//1.异或所有元素
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	//2.计算ret的二进制中哪一位元素是1
	int pos = 0;
	for (i = 0; i < 32; i++)//32bit位
	{
		if ((ret >> i) & 1 == 1)
		{
			pos = i;
		}
	}
	//3.开始分组异或
	for (i = 0; i < sz; i++)
	{
		if ((arr[i] >> pos) & 1 == 1)
		{
			*x ^= arr[i];
		}
		else
		{
			*y ^= arr[i];
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6};

	int sz = sizeof(arr) / sizeof(arr[0]);
	int x = 0;
	int y = 0;
	find_single_dog(arr, sz, &x, &y);
	printf("单身狗是:%d %d\n", x, y);
	return 0;
}

执行:因为中途(arr[i]>>pos)&1使得x和y的两个单身狗移动过位置,取最后一次的情况。

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

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

相关文章

基于C/C++将派生类赋值给基类的详细讲解

目录 将派生类对象赋值给基类对象 将派生类指针赋值给基类指针 将派生类引用赋值给基类引用 本期推荐书目 在 C/C中经常会发生数据类型的转换&#xff0c;例如将 int 类型的数据赋值给 float 类型的变量时&#xff0c;编译器会先把 int 类型的数据转换为 float 类型再赋值&a…

华为OD机试 Java 实现【查找兄弟单词】【牛客练习题 HJ27】,附详细解题思路

一、题目描述 定义一个单词的“兄弟单词”为&#xff1a;交换该单词字母顺序&#xff08;注&#xff1a;可以交换任意次&#xff09;&#xff0c;而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如&#xff1a; ab 和 ba 是兄弟单词。 ab …

三防工业平板电脑搭载大容量聚合物锂电池,满足全天候移动式作业

在制造业、物流业等行业中&#xff0c;电脑经常会接触到水&#xff0c;因此防水是非常重要的。工业三防平板电脑采用了特殊的防水技术&#xff0c;能够在水中工作&#xff0c;即使在雨天或水花溅到电脑上时也不会受到损坏。 三防工业平板电脑采用8核ARM架构处理器&#xff0c;2…

QML开发避坑指南(四):ImageProvider的使用

&#xff08;1&#xff09;引子 首先&#xff0c;ImageProvider是为QML应用提供的、一种先进的图像加载方式。 作者建议从三点理解其定义&#xff1a; 加载方式的差异&#xff1a; 相比本地资源的加载方式&#xff1a;source : “qrc:///前缀/demo.jpg”。 ImageProvider方式…

使用 ChatGPT API 构建系统(三):思维链推理

今天我学习了DeepLearning.AI的 Building Systems with the ChatGPT API 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。 下面是我们通过Open API来访问ChatGPT模型的主要代码&#xff1a; import openai#您的openai的api key openai.api_key YOUR-O…

使用FS_Hi3861鸿蒙开发板编译时常见的一些问题

本文档支持的是下面的产品 华清远见 FS-Hi3861https://gitee.com/HiSpark/hi3861_hdu_iot_application/blob/master/src/vendor/hqyj/fs_hi3861/doc/%E5%8D%8E%E6%B8%85%E8%BF%9C%E8%A7%81%20FS_Hi3861%E5%BC%80%E5%8F%91%E6%8C%87%E5%AF%BC.md 目录 在添加第三方库完成后&a…

想要精通算法和SQL的成长之路 - 下一个排列

想要精通算法和SQL的成长之路 - 下一个排列 前言一. 下一个排列二. 下一个更大元素III 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 下一个排列 原题链接 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下…

Wi-Fi 6还没用熟,Wi-Fi 7就要来了,性能“高攀不起”!

Wi-Fi作为一种无线通信技术&#xff0c;在现代生活中扮演着重要的角色。随着无线设备数量的不断增加和对高速、高容量网络的需求日益增长&#xff0c;Wi-Fi技术不断发展演进。在过去的几十年中&#xff0c;我们见证了多个Wi-Fi技术标准的推出&#xff0c;其中最新的一代是Wi-Fi…

Spring Boot集成Redisson布隆过滤器案例

1 什么是布隆过滤器 布隆过滤器实际上是一个非常长的二进制向量(bitmap)和一系列随机哈希函数。那什么又叫哈希函数呢&#xff1f;哈希函数指将哈希表中元素的关键键值通过一定的函数关系映射为元素存储位置的函数。&#xff08;HashMap源码&#xff09; 布隆过滤器的优点&…

python基于轻量级CNN模型开发构建手写藏文数字识别系统

最近做的很多工作都是跟手写性质的数据集有关的&#xff0c;比如&#xff1a;手写汉字、手写甲骨文、手写数字、手写字母等等&#xff0c;今天主要做的实践是对藏文中的手写数字进行识别分析&#xff0c;在我之前的博文中有很多相关的实践分析&#xff0c;感兴趣的话可以自行移…

图解Redis中的9种数据结构

如图所示&#xff0c;Redis中提供了9种不同的数据操作类型&#xff0c;他们分别代表了不同的数据存储结构。 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型&#xff0c;也是最简单的一种类型&#xff0c;它和我们在Java中使用的字符类型什么太大区别&…

MyBatis 万字进阶

文章目录 一. 增, 删, 改 操作1.1 修改操作1.2 删除操作1.3 添加操作1.3.1 返回受影响行数1.3.2 返回 id 二. 查询操作2.1 单表查询2.1.1 参数占位符 ${} 和 #{}2.1.2 SQL 注入问题2.1.3 ${} 的优点2.1.4 Like 查询 2.2 多表查询2.2.1 返回类型 resultType2.2.2 返回字典映射 r…

Linux内核进程创建流程

本文代码基于Linux5.10 内容主要参考《Linux内核深度解析》余华兵 当Linux内核要创建一个新进程时&#xff0c; 流程大致如下 ret fork(); if (ret 0) {/* 子进程装载程序 */ret execve(filename, argv, envp); } else if (ret > 0) {/* 父进程 */ } 大致可以分为创建新…

pagehelper分页插件(SpringBoot,Mybatis整合前后端分析)

前言&#xff1a;在学习项目的过程中遇到了数据分页的功能&#xff0c;单纯的js前端不能处理大的数据量&#xff0c;需要后端整理好数据发送给前端&#xff0c;那么使用分页插件无疑是个好选择. 目录 pagehelper依赖 接口方法mapper Mybatis Service ServiceImpl PageResu…

[IJCAI 2022] 基于个性化掩码的实用安全联合推荐

Practical and Secure Federated Recommendation with Personalized Mask | SpringerLink 摘要 联合推荐解决了推荐系统的数据筒仓和隐私问题。目前的联合推荐系统主要利用密码学或混淆方法来保护原始评分不被泄露。然而&#xff0c;前者带来了额外的通信和计算成本&#xff0…

day 49 :121. 买卖股票的最佳时机;122. 买卖股票的最佳时机 II;123. 买卖股票的最佳时机 III

买卖股票 121. 买卖股票的最佳时机&#xff1a;一次买入卖出1. 贪心算法2. 动态规划1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 代码 122. 买卖股票的最佳时机 II:可以多次买入卖出2. 动态规划1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 代码 123. 买…

Linux_进程

目录 一.进程概念与子进程 1.进程基本概念 2.通过系统调用创建子进程-fork 二.进程状态 1、一般进程状态 2、Linux操作系统的进程状态 三.环境变量 1.概念 2.环境变量组织与获取 3.配置文件 4.环境变量的全局属性​编辑 5.命令行参数 四.进程优先级 1.查看系统进…

Linux文件系统-磁盘划分

一、磁盘使用 windows系统中&#xff1a; 1、分区 2、格式化 3、自动装载 4、使用 Linux系统中&#xff1a;1、分区 2、格式化 3、手动挂载 &#xff08;挂载到/etc/fstab实现开机自启&#xff09; 4、使用 Linux系统中磁盘使用&#xff1a; 1、分区操作…

rust:cargo 和rustc 以及一点 小技巧

在正式学习 Rust 语言以前&#xff0c;我们需要先学会怎样输出一段文字到命令行&#xff0c;这几乎是学习每一门语言之前必备的技能&#xff0c;因为输出到命令行几乎是语言学习阶段程序表达结果的唯一方式。 在之前的 Hello, World 程序中大概已经告诉了大家输出字符串的方式…

system V共享内存

一、前言 共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递将不再涉及到内核&#xff0c;换句话说&#xff0c;进程将不再通过执行进入系统内核的系统调用来传递彼此的数据。 但其实比它好用的进程间通信还有很多种&…