持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
🚩write in front🚩
🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 阿里云星级博主~掘金⇿InfoQ~51CTOP创作者(创作新人榜No.38)~[CSDN]周榜102﹣总榜826 ⇿ 全网访问量35w+🏅
🆔本文由 謓泽 原创 发布在51CTOP 如需转载还请通知⚠
📝个人主页-謓泽 的个人主页 - 文章 - 掘金 (juejin.cn)📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏-【C语言】Topic - 謓泽的专栏 - 掘金 (juejin.cn)🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
🍊第六十八题→找出单数🍊
⒈题目本质的内容。
说明⇢定义⑩个元素的数组,假设有四组数字都出现了两次,也就出现了⑧个元素。剩下两个元素就是我们需要寻找的单数,把它编写一个fun()函数当中去实现功能。
⒉规定⇢数组的内容。
int arr[10] = {2,3,4,5,8,9,2,3,4,5}; 运行结果√ 8 9
说明⇢以上就是这道题目的内容了,这道题目还是比较有难度的。如果学过数据结构的小伙伴们这道题还是可以给它解决的。如果没有的话可能看这道题目就会比较懵不知从哪出地方下手,比如我◑﹏◐
⒊题解思路如下。
①可以最低位的放在一组,最低位为0的放在一组。这实际上就是给它进行分组了。
例⇢2 = 0010 ,3 = 0011。那么这不是很明显就达到了一个分组的效果了。
②所有的数字进行按位异或(^)的操作,运算规则。
0^0=0; 0^1=1; 1^0=1; 1^1=0;
说明⇢我们把上面所定义的元素全部异或一遍,我们知道相同的元素异或还是为零。那么在这里无非就是 8 和 9 进行按位异或。
注意⇢相同两个结果异或结果为零,那么⑧和⑨异或的结果绝对是不等于零的「8 ^ 9 != 0」
③计算全部异或之后的结果哪一位为①,实际上奇数最低为为1,偶数最低位为0的。
④把从低位向高的第0位为1,是0的直接放在另外一个组,假设变量0为1的。
说明⇢那么以上就是这道题目的解题思路了,不妨自己尝试下(✿◕‿◕✿)
示例代码如下👇
#pragma warning(disable:6031)
#define _CRT_SECURE_NO_WARNINGS 1
#pragma message("第六十八题→找出单数")
#include<stdio.h>
void fun(int arr[], int sz, int* qx, int* qy)
{
//1.所有的数字异或
int i = 0;
int ret = 0;//所有数字异或
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
//2.计算ret哪一位为1,奇数最低为为1,偶数最低位0。
int o = 0;
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1) == 1)
{
o = i;
break;//跳出
}
}
//3.把从低位向高的第o位为1,为0的直接仿在另外一个组。
int num1 = 0;
int num2 = 0;
for (i = 0; i < sz; i++)
{
if (((arr[i] >> o) & 1) == 1)
{
num1 ^= arr[i];
}
else
{
num2 ^= arr[i];
}
*qx = num1;
*qy = num2;
}
}
int main(void)
{
int x = 0, y = 0;
int arr[10] = { 2, 3, 4, 5, 8, 9, 2, 3, 4, 5 };
int sz = sizeof(arr) / sizeof(arr[0]);
fun(arr, sz, &x, &y);
printf("num:%d %d\n", x, y);
return 0;
}
运行结果🖊 num:9 8