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

这篇具有很好参考价值的文章主要介绍了【C刷题笔记】找单身狗问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

版本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);
}

执行: 

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

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

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

分析:

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

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

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

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

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

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

 

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

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

第三步:开始分组异或

1.分组:

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

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

 这是倒数第一位bit位为0的情况:【C刷题笔记】找单身狗问题

 

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

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

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

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

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的两个单身狗移动过位置,取最后一次的情况。

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

【C刷题笔记】找单身狗问题文章来源地址https://www.toymoban.com/news/detail-469871.html

到了这里,关于【C刷题笔记】找单身狗问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 刷题笔记(跑路人笔记)

    刷题笔记第一道题跟后面没啥关系 但是后两道关系比较明显 最后一道题看不懂的朋友请多看看倒数第二道题 连接 一个规律=-=而非思想,叫 三趟逆置法 想要旋转数组元素的前K个只需要 先逆置N-K项 再逆置K项 再整体逆置 首先说一下旋转和逆置的区别 以数组: 1,2,3,4,5,6,7,8为例

    2024年02月02日
    浏览(28)
  • 好兄弟单身?这不得用python来帮他脱离苦海

    明天什么节日 ?明天谁过节 ? 是你吗,还是你的朋友 ?如果是你的话,那咱就帮帮朋友,到年龄的咱就直接相亲呗 赠人玫瑰 手留余香 好人做到底,来让朋友体验体验恋爱的感觉~ 今天就带你们来爬爬相亲网站的数据信息 如果明天你不过节,那你也可以自己筛选筛选,这种

    2024年02月05日
    浏览(26)
  • 全局单身汉:深入理解 Python 中的单例对象

    项目 描述 搜索引擎 Google 、Bing Python 官方文档 项目 描述 Python 解释器 3.10.6 单例对象 在 Python 中,单例对象是一种设计模式,旨在确保在应用程序中只有一个特定类的实例。这意味着无论创建多少个该类的实例,都将始终引用相同的实例。 单例对象的优缺点 单例对象的优点

    2024年02月02日
    浏览(35)
  • 【LeetCode】260.只出现一次的数字 III(找出单身狗)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一只单身狗: 两只单身狗: 本篇主要讲解LeetCode上的经典题型:只出现一次的数字,我汇总了该类问题的两种情况(一只单身狗

    2024年02月16日
    浏览(35)
  • 10个Python绘画表白代码【内附源码,再不收藏你只能单身了】

    发现一些很好玩的画图小项目,今天分享给大家,教你怎样用Python画一朵玫瑰花、时钟、爱心、太阳花、月饼、进阶自定义爱心、小猪佩奇、星空、超梦幻的蓝色背景樱花等大家快来学习吧。 pycharm 、python

    2024年02月12日
    浏览(27)
  • 力扣刷题笔记

    诸神缄默不语-个人CSDN博文目录 我以前刷过一波力扣,然后全忘了……从0开始的力扣复活赛! 以前刷题用的是Java,现在Java几乎忘光了,所以现在是Python 3 + Java双语选手。 以下题目按照力扣官方顺序排列。 449. 序列化和反序列化二叉搜索树 1281. 整数的各位积和之差 1749. 任意

    2024年02月14日
    浏览(30)
  • 搜索 (C++刷题笔记)

    力扣 DFS 标记当前搜索位置已被搜索(标记当前位置的mark数组为1) 按照四个方向扩展四个新位置newx,newy 若新位置不在地图范围内,则忽略 如果新位置未曾到达mark[new][newy],且是陆地,继续DFS该位置 BFS 设置搜索队列Q,标记mark[x][y]=1,并将待搜索位置(x,y)进入队列 只要队列不

    2024年02月03日
    浏览(17)
  • html刷题笔记

    1 em = 12 pt = 16 px = 100% source元素 为 audio、video、picture元素指定多个媒体文件 margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔 。 margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段

    2024年02月04日
    浏览(24)
  • 刷题笔记4

    斐波那契数列:1,1,2,3,5,8,13…… 递归一把解决三类问题:1.数据定义是按照递归的(斐波那契数列)。2.问题解法是按递归算法实现的。 3.数据形式是按照递归形式定义的。 递归的一般形式: 有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月

    2024年01月18日
    浏览(21)
  • 【刷题笔记4】

    斐波那契数列:1,1,2,3,5,8,13…… 递归一把解决三类问题:1.数据定义是按照递归的(斐波那契数列)。2.问题解法是按递归算法实现的。 3.数据形式是按照递归形式定义的。 递归的一般形式: 有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月

    2024年01月21日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包