【LeetCode刷题】——找(一只或者多只)单身狗
目录
找(一只或者多只)单身狗题目
解题思路的分享 (一只单身狗)
题目源码的分享
解题思路的分享 (多只单身狗)
题目源码的分享
本菜鸡&总结
博客昵称:陈大大陈
座右铭:所谓觉悟,就是在漆黑的荒野上开辟出一条理当前进的光明大道。
博主简介:一名热爱C/C++和算法等技术,喜欢运动,爱胡思乱想却胸怀大志的小博主!
博主&唠嗑:早午晚哈喽Ciao!各位CSDN的朋友!我是博客新人陈大大陈,希望我的文章能为你带来帮助!欢迎大家在评论区畅所欲言!也希望大家多多为我提出您宝贵的建议!如果觉得我写的不错的话还请点个赞和关注哦~
作业标题
找单身狗
作业内容
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6
只有5和6只出现1次,要找出5和6.
我们来看下面的例子。
#include
void Single_Dog(int *a, int sz,int *x)
{
for (int i = 0; i < sz; i++)
{
*x ^= a[i];
}
}
int main()
{
int x = 0;
int a[] = { 1,1,2,2,3,3,4,4,5 };
int sz = sizeof(a) / sizeof(a[0]);
Single_Dog(a, sz, &x);
printf("单身狗是%d",x);
return 0;
}
运行结果如下:
上面是只有一只单身狗的情况,如果单身狗有两只该怎么办呢?
#include
void Single_Dog(int* a,int sz,int *m,int *n)
{
int i, pos = 0, ret = 0;
for (i = 0; i < sz; i++)
{
ret^= a[i];
}
for (i = 0; i < 32; i++)
{
if (ret >> i == 1)
{
pos = i;
break;
}
}
for (i = 0; i < sz; i++)
{
if ((a[i]>>pos&1) == 0)
{
*m ^= a[i];
}
else if ((a[i] >> pos&1) == 1)
{
*n ^= a[i];
}
}
}
int main()
{
int a[] = { 1,1,2,2,3,3,4,4,5,5,6,6,7,8 };
int sz = sizeof(a) / sizeof(a[0]);
int m = 0, n = 0;
Single_Dog(a, sz, &m, &n);
printf("%d %d", m, n);
return 0;
}
这篇博客旨在总结我自己阶段性的学习,要是能帮助到大家,那可真是三生有幸!如果觉得我写的不错的话还请点个赞和关注哦~我会持续输出编程的知识的!
这道题目的方法很难想到,实在不行的话咱们也可以直接采取暴力方式
也就是先排序,在经过一系列操作找出单身狗,不过这个方法有点太复杂了。