君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,在写这篇博客的前一天是七夕,也是中国传统的“情人节”,不知道

勤时当勉励 岁月不待人
Hello,米娜桑们,这里是君兮_,在写这篇博客的前一天是七夕,也是中国传统的“情人节”,不知道各位脱单了吗?碰巧最近刷题时遇到了经典的单身狗问题想带大家深入探讨一下,如果没脱单的话不如继续学习吧,记住,如果你喜欢的人不喜欢你,就变得足够优秀让她/他喜欢上你吧!!
//找出单身狗-版本1//有一个数组只有一个数组出现一次,其余数字都是成对出现的//请找出只出现一次的数字//1 2 3 4 5 1 2 3 4 我们知道对于异或来说相同为0,相异为1//a^a=0;//a^0=a; int find_single_dog1(int arr[], int sz){int i = 0;int ret = 0;for (i = 0; i < sz; i++){ret ^= arr[i];}return ret;}int main(){int arr[] = { 1,2,3,4,5,1,2,3,4 };int sz = sizeof(arr) / sizeof(arr[0]);int dog = find_single_dog1(arr, sz);printf("%d\n", dog);return 0;} 
//找出单身狗版本2//一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。、//编写一个函数找出这两个只出现一次的数字。//例如://有数组的元素是:1,2,3,4,5,1,2,3,4,6//只有5和6只出现1次,要找出5和6. void find_single_dog2(int arr[], int sz, int* pd1, int* pd2){//1. 所有数字异或在一起int ret = 0;//5 ^ 6int i = 0;for (i = 0; i < sz; i++){ret ^= arr[i];}//2. 计算ret的第几位是1,从而找出不同进行分组int pos = 0;for (i = 0; i < 32; i++){if (((ret >> i) & 1) == 1){pos = i;break;}} //分组//计算数组中元素的第pos为1的异或 for (i = 0; i < sz; i++){if (((arr[i] >> pos) & 1) == 1){*pd1 ^= arr[i];}}//计算数组中元素的第pos为0的异或*pd2 = ret ^ *pd1;}int main(){int arr[] = { 1,2,3,4,5,1,2,3,4,6 };int dog1 = 0;int dog2 = 0;int sz = sizeof(arr) / sizeof(arr[0]);find_single_dog2(arr, sz, &dog1, &dog2);printf("%d %d", dog1, dog2);return 0;} a^b^a=b 

int* findErrorNums(int* nums, int numsSize, int* returnSize){ int ret=0; int*returnNums=(int*)malloc(sizeof(int)*2); *returnSize=2; int i=0; //通过把数组中元素和1到n中元素异或起来,找到多余元素以及缺少的元素 (找两条单身狗) for(i=0;i<numsSize;i++) { ret^=(i+1); ret^=nums[i]; } int pos=0; i=0; //异或后不同位二进制为1,找1分组 while(i<32) { if(((ret>>i)&1)==1) { pos=i; break; } i++; } //找出不同位后分组,只用找一个就行 int nums1=0; int nums2=0; for(i=1;i<=numsSize;i++) { if(((i>>pos)&1)==1) { nums2^=i; } } for(i=0;i<numsSize;i++) { if(((nums[i]>>pos)&1)==1) { nums1^=nums[i]; } } nums1^=nums2;//分组后的元素异或1-n找相同元素消掉 //多的或者少的那个元素,不确定,我们需要判断一下 int flag=0;//标记 for(i=0;i<numsSize;i++) { if(nums[i]==nums1) { flag=1; returnNums[0]=nums1; break; } } if(flag==1)//数组中找到了这个元素,为重复元素,另一个为缺少元素 returnNums[1]=ret^nums1; else { returnNums[1]=nums1; returnNums[0]=nums1^ret; } return returnNums; } 今天的内容到这里就结束了,有关位运算的地方如果不太清楚最后自己画画逻辑图就能弄懂,而有关题目博主建议如果看懂了的话不妨自己动手试试哦!!
好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

来源地址:https://blog.csdn.net/syf666250/article/details/132462664
--结束END--
本文标题: 【每日易题】七夕限定——单身狗问题以及进阶问题位运算法的深入探讨
本文链接: https://www.lsjlt.com/news/408199.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0