您的位置:首页 > 其它

一组数据中只有一个数字出现了一次和 一组数据中只有两个个数字出现了一次其他所有数字都是成对出现的。请找出这个数字

2016-11-06 20:03 831 查看
<span style="font-size:24px;">一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字
</span><span style="font-size:18px;">
方法一(不用位运算)

分析:用两个for循环遍历整个数组,从前至后取出数组中的元素,每取出一个数,与后面的数依次比较,直到找到出现一次的数停止
#include<stdio.h>
</span>
<span style="font-size:18px;">#include<stdio.h>
int main()
{

int arr[]={1,3,5,7,1,3,5};
int i=0;
int j=0;

for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
int flag=0;
for(j=i+1; j<sizeof(arr)/sizeof(arr[0]);j++)
{

if((arr[i]^arr[j])==0)
{
flag=1;
break;
}
}
if(flag==0)
{
printf("%d\n",arr[i]);</span>
<span style="font-size:18px;">	break;
}
}
system("pause");
return 0;
}</span>
<span style="font-size:18px;">方法二(位运算)

分析:因为除一个数X之外其余都是成对出现的,当一个数异或本身时结果为零,0异或X为X,即为结果
</span>
<span style="font-size:18px;"></span><pre name="code" class="cpp"><pre name="code" class="cpp">#include<stdio.h>
int find(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=0;
int ret=0;
sz=sizeof(arr)/sizeof(arr[0]);
ret=find(arr,sz);
printf("%d\n",ret);
system("pause");
return 0;

}
一组数据中只有一个数字出现了二次。

其他所有数字都是成对出现的。请找出这个数字

方法一(不用位运算)

分析:用两个for循环遍历整个数组,与只有一个数出现不同的是第二个for循环,第一个for循环从,从前至后取出数组

的数X,第二个for 循环从数组第一个数开始判断是否与X 相等,但跳过本身X,当出现满足条件的结果则输出

#include<stdio.h>
int main()
{

<span style="white-space:pre">	</span>int arr[]={1,3,5,7,8,1,3,5};
<span style="white-space:pre">	</span>int i=0;
<span style="white-space:pre">	</span>int j=0;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>int flag=0;

<span style="white-space:pre">		</span>for(j=sizeof(arr)/sizeof(arr[0])-1; j>=0; j--)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>if(j!=i)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>if((arr[i]^arr[j])==0)
<span style="white-space:pre">				</span>{
<span style="white-space:pre">					</span>flag=1;
<span style="white-space:pre">					</span>break;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>if(flag==0)
<span style="white-space:pre">				</span>{
<span style="white-space:pre">					</span>printf("%d\n",arr[i]);
<span style="white-space:pre">				</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">		</span>system("pause");
<span style="white-space:pre">		</span>return 0;
}
方法二(用位运算)

分析:采用分组的方法,例:1 2 3 4 5 6 1 2 3 4 将5 6分别放在不同的组中,即可用一个数只出现一次的方法运算
但用上述方法结果为5^6,如何分组:两个数不相同,例5 6  则异或的的到的数二进制必定存在1,1是有0^1得到的。
则某位异或结果为1时,此时按照5 6 的二进制形式在当位上是0或是1来分组
0101    //5
0110    //6
0011    //3(5^6)
按照最后一位是否是1分组结果为
{1,3,5,1,3}和{2,4,6,2,4}
各自异或的结果分别为 5 和6
#include<stdio.h>
void find(int arr[],int sz,int *num1,int *num2)
{
<span style="white-space:pre">	</span>int i=0;
<span style="white-space:pre">	</span>int ret=0;
<span style="white-space:pre">	</span>int pos=0;
<span style="white-space:pre">	</span>for(i=0; i<sz; i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>ret^=arr[i];
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>for(i=0; i<32;i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>if((ret>>i)&1==1)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>pos = i;
<span style="white-space:pre">			</span>break;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>for(i=0; i<sz; i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>if((arr[i]>>pos)&1==1)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>*num1^=arr[i];
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>*num2^=ret^*num1;
}
int main()
{
<span style="white-space:pre">	</span>int arr[]={1,2,3,4,5,6,1,2,3,4};
<span style="white-space:pre">	</span>int sz=0;
<span style="white-space:pre">	</span>int x=0;
<span style="white-space:pre">	</span>int y=0;
<span style="white-space:pre">	</span>sz=sizeof(arr)/sizeof(arr[0]);
<span style="white-space:pre">	</span>find(arr,sz,&x,&y);
<span style="white-space:pre">	</span>printf("%d %d\n",x,y);
<span style="white-space:pre">	</span>system("pause");
<span style="white-space:pre">	</span>return 0;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐