C语言实现单身狗问题(找出单身狗详解版)

今天我们用C语言来实现一个单身狗问题,让我们开始学习吧!


目录

1.单身狗问题初阶版(找一只单身狗)

代码实现

2.单身狗问题进阶版(找两只单身狗)

代码实现


1.单身狗问题初阶版(找一只单身狗)

问题描述:

在一堆数据中,其余数字都出现两次,只有这个数字出现一次,找到这个只出现一次的数字(它就是那只单身狗),并输出单身狗

方法分析:

我们这里要用到“异或(^)”,我们首先要知道什么是异或

相同为0,相异为1

例如:5^6(两个数异或时,是用二进制进行异或运算的)

0和任何数异或都等于任何数

知道这些,我们就可以进行问题分析了:

假设我们输入了10个数:1 2 3 4 5 1 2 3 4 

让它们整体异或,我们把这10个数排成有序数列,就是1 1 2 2 3 3 4 4 5(这与不排序整体异或结果是一样的),我们会发现1^1=0,2^2=0,以此类推到了最后就是0^5=5,所以把它们放一起异或就得到了5,这样也就找到了这只单身狗

接下来我们看一下完整代码吧:

代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//找出单身狗,找一只狗

int main()
{
	//随机9个数存进去
	int arr[9] = { 0 };
	int i = 0;
	for (i = 0; i < 9; i++)
	{
		scanf("%d", &arr[i]);
	}
	int ret = 0;//接收异或值
	//整体异或
	for (i = 0; i <9 ; i++)
	{
		ret ^= arr[i];
	}
	printf("单身狗是 %d\n", ret);
	return 0;
}

运行结果:

这样我们就求得了这只单身狗

2.单身狗问题进阶版(找两只单身狗)

我们理解了用异或这个运算符求单身狗后,我们就可以进阶学习了

问题描述:

一个数组中只有两个数字只出现一次,其他所有数字都出现了两次,编写一个函数找出这两只只出现一次的单身狗

方法分析:

我们已经知道异或,接下来这个问题也是用异或这个方法来解决的,但是我们要找出两只狗,我们想想,是不是把两个只出现一次的数字放在两个不同的组,再把其余出现两次的数字在按一定的方法放在这两个组,再分别对这两个组进行整体异或操作就可以像初阶版一样找出这两只单身狗

例如:这几个数字是 1 2 3 4 5 6 1 2 3 4 

我们理想中的两个组存放的数据是:

组1: 5  后面的数字

组2: 6  后面的数字

那我们现在要解决的就是,如何把它们放在两个组中

我们先把这10个数字整体异或,最后结果一定就变成了0^5^6=3  (0000 0011)

我们根据这个异或结果 3 对我们的数据进行分组,3这个数的二进制有011,我们就按1来对数据分组,那么我们就可以得到

组1(二进制第一位为1):5 1 1 3 3

组2(二进制第二位为1):6 2 2 4 4

如何判断一个数对应的二进制位数上是0 还是1呢?

这就要用到我们初识C语言中的移位操作符了:左移:‘<<’     右移:'>>'

比如: 1,它的二进制第一位就是1,所以我们只需要右移0位就可以把它分到第一组

            2,它的二进制第二位是1,所以我们需要右移1位把它分到第二组

以此类推,就得到了我们的两个组。

这里讲清楚之后,我们进行代码的实现:

代码实现

//进阶版,找两只单身狗

void find_single_dog(int arr[], int sz, int single_dog[])
{
	int ret = 0;//用ret来初始异或所有数据
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	//计算ret的二进制位哪一位为1,标记这个位置,用来后续分组0和1
	int pos = 0;
	for (i = 0; i < 32; i++)
	{
		if (((ret >> i) & 1) == 1)
		{
			pos = i;//得到了为1的二进制位
			break;
		}
	}
	//进行分组
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			single_dog[0] ^= arr[i];
		}
		else
		{
			single_dog[1] ^= arr[i];
		}
	}
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,1,2,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int single_dog[2] = { 0 };//用来存放两只单身狗
	find_single_dog(arr, sz, single_dog);
	int i = 0;
	//打印这两只单身狗
	printf("这两只单身狗是:>");
	for (i = 0; i < 2; i++)
	{
		printf(" %d  ", single_dog[i]);
	}
	return 0;
}

运行一下


这就是我们有关单身狗问题的解决方案,大家可以根据这种办法,展开联想,再创一种办法!好了,今天的内容就到这里,我们下期再见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二十六、W5100S/W5500+RP2040树莓派Pico<WOL示例>

文章目录 1 前言2 简介2 .1 什么是Wake on LAN&#xff1f;2.2 Wake on LAN的优点2.3 Wake on LAN数据交互原理2.4 Wake on LAN应用场景 3 WIZnet以太网芯片4 Wake on LAN示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关…

华为组织绩效管理——华为战略执行和落地的核心抓手(好文分享)

【导语&#xff1a;华为战略执行和落地的核心抓手是组织绩效管理。在战略管理中&#xff0c;华为和其他企业最大区别的地方就是华为更强调的是组织绩效的管理。】​ 我接触的很多企业只有个人绩效没有组织绩效&#xff0c;也就是公司的战略直接分解到个人。对于小企业而言&…

LeetCode题94,44,145,二叉树的前中后序遍历,非递归

注意&#xff1a;解题都要用到栈 一、前序遍历 题目要求 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[…

如何ThingsBoard 仪表盘中快速地构建自己的实时应用?使用html markdwon 最新值部件

众所周知&#xff0c;tb是一个非常优秀的开源物联网平台&#xff0c;当我们使用它收集了一些设备数据后&#xff0c;该如何将其更加美化&#xff0c;自由自在地显示到页面上&#xff0c;搭建一个仪表盘&#xff0c;给客户看那&#xff1f; 要显示某个遥测数据&#xff0c;或者…

金蝶云星空与金蝶云星空对接集成盘亏单查询打通盘亏单新增

金蝶云星空与金蝶云星空对接集成盘亏单查询打通盘亏单新增 接通系统&#xff1a;金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&am…

解决pikachu中RCE中文乱码的问题

这个问题我在DVWA中的RCE栏目同样遇到过&#xff0c;今天在做pikachu的RCE的时候也遇到了&#xff0c;所以特此来解决一下这个问题&#xff0c;解决方法很简单&#xff0c;在源码中加入下一行代码。 $result iconv("GBK", "UTF-8", $result);加在68行前面…

Java学习笔记(七)——面向对象编程(中级)

一、IDEA &#xff08;一&#xff09;常用的快捷键 &#xff08;二&#xff09;模版/自定义模版 二、包 &#xff08;一&#xff09;包的命名 &#xff08;二&#xff09;常用的包 &#xff08;三&#xff09;如何引入&#xff08;导入&#xff09;包 &#xff08;四&am…

腾讯云新客户服务器88元/年,540元/3年,另有5年新用户服务器

在选择云服务器时&#xff0c;首先需要考虑的是性能与配置是否与自己的需求相匹配。对于小型网站或者个人博客&#xff0c;轻量应用服务器是一个不错的选择。腾讯云双十一活动中&#xff0c;2核2G轻量应用服务器的活动优惠价为88元/年&#xff0c;2核4G轻量应用服务器的活动优惠…

如何利用大模型蒸馏出小模型实现降本

如何让小模型的推理效果在某些领域比 ChatGPT 这样的大模型还要更强&#xff1f;这篇论文提供了一个思路&#xff1a;https://arxiv.org/abs/2212.10071&#xff0c;借助思维链&#xff08;CoT&#xff09;逐步解决复杂推理任务的能力&#xff0c;可以使用大模型作为推理教师&a…

正交矩阵的定义

对于n阶矩阵A&#xff0c;如果&#xff0c;其中为单位矩阵&#xff0c;为A的转置矩阵&#xff0c;那么就称A为正交矩阵。 对于正交矩阵&#xff0c; 对于正交矩阵&#xff0c;其列向量都是单位向量&#xff0c;行向量都是单位向量

酷柚易汛ERP - 其他收支明细表操作指南

1、应用场景 其他收支明细表统计一段时期内其他收入单、其他支出单的收支项目、收入/支出及往来单位信息。 2、主要操作 打开【资金】-【其他收支明细表】&#xff1a;

Marin说PCB之 PCB封装和原理图封装的藕断丝连

最近天气开始降温了&#xff0c;小编我不得不拿出珍藏多年的秋裤穿上了&#xff0c;就是走路不太方便&#xff0c;有点紧啊&#xff0c;可能是当时衣服尺码买小了吧&#xff0c;不可能是我吃胖了&#xff0c;这个绝对不可能。 话说小编我今年属实有点走霉运啊&#xff0c;下班和…

沧州市壹家人社工小赵庄乡社工站常态化开展关爱一老一小活动

沧州市壹家人社会工作服务中心承接新华区小赵庄乡社工站以来以服务一老一小为工作重点&#xff0c;发挥五社联动的重要作用&#xff0c;开展“幸福院”和“护蕾驿站”两个微项目&#xff0c;聚焦需求&#xff0c;采取社工引领志愿服务的模式&#xff0c;常态化为老人和孩子开展…

【吐血总结】前端开发:一文带你精通Vue.js前端框架(六)

文章目录 前言1️⃣计算属性2️⃣监听属性3️⃣样式绑定4️⃣总结 前言 上一篇中我们学习了vue.js 的条件语句、循环语句等知识点.&#xff0c;现在让我们接着Vue系列的学习。 Vue中属性与样式绑定在开发中的作用不可或缺。例如实现单位的换算、监听和响应数据的变化及输入事件…

vue3 setup() 高级用法

文章目录 前言一、选项式API 和 组合式API 区别用一张图告诉你它们的区别&#xff1a; 二、setup 具体怎么用&#xff1f;2.1、setup 什么时候执行&#xff1f;2.2、setup 数据和方法如何使用&#xff1f;2.3、setup 内部有 this 吗&#xff1f;2.4、setup 内钩子函数如何使用&…

进博会再现上亿大单 EZZ携手HIC海橙嗨选签署2024年度合作备忘录

正在举行的第六届中国国际进口博览会上&#xff0c;再现上亿大单。11月6日&#xff0c;在澳大利亚新南威尔士州政府代表的见证下&#xff0c;澳交所基因组龙头上市公司EZZ生命科学和中国跨境社交电商龙头HIC海橙嗨选签署2024合作备忘录&#xff0c;在未来的一年&#xff0c;EZZ…

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多…

【算法每日一练]-单调队列(保姆级教程 篇2)#琪露诺 #选数游戏 #寻找段落

最后一期单调队列了啊 目录 题目&#xff1a;琪露诺 思路&#xff1a; 题目&#xff1a;选数游戏 思路&#xff1a; 题目&#xff1a;寻找段落 思路&#xff1a; 之前做的都是连续的长度区间求最值&#xff0c;今天体验一下不连续的区间。 然后就是要注意维护单调队列时…

说说你对immutable的理解?如何应用在react项目中?

一、是什么 Immutable,不可改变的,在计算机中,即指一旦创建,就不能再被更改的数据 对 Immutable对象的任何修改或添加删除操作都会返回一个新的 Immutable对象 Immutable 实现的原理是 Persistent Data Structure(持久化数据结构): 用一种数据结构来保存数据当数据被修…

1.jvm基本知识

目录 概述jvm虚拟机三问jvm是什么&#xff1f;java 和 jvm 的关系 为什么学jvm怎么学习为什么jvm调优?什么时候jvm调优调优调什么 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址 jvm虚拟机三问 j…