【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日
    浏览(34)
  • 全局单身汉:深入理解 Python 中的单例对象

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

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

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

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

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

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

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

    2024年02月12日
    浏览(37)
  • 刷题笔记4

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

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

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

    2024年01月21日
    浏览(50)
  • 搜索 (C++刷题笔记)

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

    2024年02月03日
    浏览(28)
  • Verilog刷题笔记14

    题目: One drawback of the ripple carry adder (See previous exercise) is that the delay for an adder to compute the carry out (from the carry-in, in the worst case) is fairly slow, and the second-stage adder cannot begin computing its carry-out until the first-stage adder has finished. This makes the adder slow. One improvement is a carry-select adder, sh

    2024年01月18日
    浏览(26)
  • Verilog刷题笔记16

    题目: Since digital circuits are composed of logic gates connected with wires, any circuit can be expressed as some combination of modules and assign statements. However, sometimes this is not the most convenient way to describe the circuit. Procedures (of which always blocks are one example) provide an alternative syntax for describing circuits. For syn

    2024年01月18日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包