• 一个单身狗 和 两个单身狗


    一个单身狗

    一个数组中只有个数字是出现一次,其他所有数字都出现了两次。

    编写一个程序找出这个只出现一次的数字。

    方法1(异或)

    • a ^ a = 0
    • a ^ 0 = a
    • ^满足结合律
    #include
    int main()
    {
    	int arr[] = { 1,2,3,4,5,4,2,3,5};
    	int i = 0;
    	int ret = 0;
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	for (i = 0; i < sz; i++)
    	{
    		ret = ret ^ arr[i];
    	}                      
    	printf("单身狗:%d\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    方法2(暴力求解法)

    #include
    int main()
    {
    	int arr[] = { 1,2,3,4,5,4,2,3,5 };
    	int i = 0;
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	for (i = 0; i < sz; i++)
    	{
    		int count = 0;
    		int j = 0;
    		for (j = 0; j < sz; j++)
    		{
    			if (arr[i] == arr[j])
    			{
    				count++;
    			}
    		}
    		if (1 == count)
    		{
    			printf("单身狗:%d\n", arr[i]);
    			break;
    		}
        }
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    两个单身狗

    一个数组中只有个数字是出现一次,其他所有数字都出现了两次。

    编写一个函数找出这两个只出现一次的数字。

    假设是1, 2, 3, 4, 5, 6, 4, 3, 2, 1

    思路:只要是不同的数,异或后肯定有1,是1的那个二进制位不相同

    所以我们可以把它们分成两组(按照5和6二进制某一位的不同)

    十进制二进制
    5101
    6110

    比如:
    拿最后一位分组:
    1 1 3 3 5 (最后1位是1)
    2 2 4 4 6 (最后1位是0)
    拿倒数第二位分组:
    1 1 4 4 5 (是0)
    2 2 3 3 6 (是1)

    过程:
    1.全部异或在一起
    2.计算第几位是1
    3.分组

    #include
    void dog2(int arr[], int sz)
    {
    	int ret = 0;
    	int i = 0;
    	//1.全部异或在一起
    	for (i = 0; i < sz; i++)
    	{
    		ret ^= arr[i];
    	}
    	//2.计算ret第几位是1,得到pos
    	int pos = 0;
    	for (i = 0; i < 32; i++)
    	{
    		if (((ret >> i) & 1) == 1)
    		{
    			pos = i;
    			break;
    		}
    	}
    	//3.分组
    	int s1 = 0;
    	int s2 = 0;
    	for (i = 0; i < sz; i++)
    	{
    		if (((arr[i] >> pos) & 1) == 1)
    			s1 ^= arr[i];
    		else
    			s2 ^= arr[i];
    	}
    	printf("单身狗1是%d\n单身狗2是%d", s1, s2);
    }
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,4,3,2,1 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	dog2(arr, sz);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    问题解决:Docker:IPv4 forwarding is disabled
    UWB芯片DW3000之PDOA测向实现源码
    搞定这些问题,你就搞定了MySQL的视图
    【探索Linux】—— 强大的命令行工具 P.11(基础IO,文件操作)
    电影评分数据分析案例-Spark SQL
    latex 伪代码 algorithm2e方式
    我们不一样①
    自定义MVC增删改查
    SQL必需掌握的100个重要知识点:分组数据
    【AHK】任务栏调节音量/边缘滚动调节/边缘触发
  • 原文地址:https://blog.csdn.net/2302_77179144/article/details/133829184