一个数组中所有的数都是成对出现的只有一个或者两个数字是单独的,求这个数

如果只有一个数,那么我们可以用按位亦或(^)来得到,代码如下:

#include<stdio.h>
int main()
{
int arr[] = { 1, 1, 2, 2, 3, 3, 4 };
int size = sizeof(arr) / sizeof(int);
int num = 0;
for (int i = 0; i < size; i++)
{
num ^= arr[i];
}
printf("%d\n", num);
system("pause");
return 0;
}

如果是两个数,那么我们可以对这个数组进行拆分,然后分别与0亦或,其拆分思想就是把数组所有的数全部亦或,所得到的的结果其本质就是那两个单独出现的数的亦或结果,由于亦或其本质就是相同为0,相异为1,所以这个数每个为1的位就是其不同的位,我们可以找出它第一个为1的位进行标记,把为一的亦或的一起,为0的亦或到一起,所得的结果就是两个数,实现代码如下:

#include<stdio.h>
void find_num(int *arr, int size)//其实现功能进行函数封装,因为是要返回两个值,C语言                                      //实现故吧这两个值打印出来
{
int num1 = 0;
int num2 = 0;
int end_num = 0;
int flag = 0;
for (int i = 0; i < size; i++)
{
end_num ^= *(arr + i);
}
while (!(end_num & 1))
{
flag++;
end_num >>= 1;
}
for (int i = 0; i < size; i++)
{
int tmp = arr[i] >> flag;
if (tmp & 1)
{
num1 ^= arr[i];
}
else
{
num2 ^= arr[i];
}
}
printf("num1=%d\nnum2=%d\n", num1, num2);
}
int main()//验证阶段
{
int arr[] = { 1, 1, 2, 2, 3, 3, 4, 5 };
int size = sizeof(arr) / sizeof(arr[0]);
find_num(arr,size);
system("pause");
return 0;
}

如有什么错误不足,希望批评指正

时间: 2024-12-26 16:52:57

一个数组中所有的数都是成对出现的只有一个或者两个数字是单独的,求这个数的相关文章

JS案例之8——从一个数组中随机取数

近期项目中遇到一个需求,从一个列表中随机展示列表的部分内容,需求不大,JS也非常容易实现.主要是运用到了Math对象的random方法,和Array的splice方法. 思路是先新建一个数组,存放所有的列表,然后算出随机数,从数组中取出这个随机索引对应的值,然后组成一个随机数组. 源代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" Conten

一个数组中,一些数出现2次,只有两个数各出现一次,找出这两个数

https://leetcode.com/problems/single-number-iii/ 初次看到这题时,就想到用异或,但只能找出这两个数异或的结果,不能找出这两个数.最后我用快排过了,然后去看了看人家的思路.看来还是得仔细分析其中的隐藏信息啊.比如:从这两个数异或后的结果值可以看出,从低位开始到某一位不为0时,一定是这两个数的二进制位在此时不同了(从低位开始一定可以找到一个不为0的,因为这两个数不同).这个位可以用树状数组的lowbit方法将异或值与此值的负数进行异或求出.然后将这个数

java 判断一个数组中个元素是否为给定字符串的子串。返回一个boolean数组

public class SubString { public boolean[] chkSubStr(String[] p, int n, String s) { boolean [] str=new boolean[n]; for (int i = 0; i < p.length; i++) { int result = s.indexOf(p[i]); if(result!=-1){ str[i]=true; } else{ str[i]=false; } } return str; }

求出数组中超过一半的数

Tango 是微软亚洲研究院的一个试验项目.研究院的员工和实习生们都很喜欢在 Tango上面交流灌水.传说,Tango 有一大"水王",他不但喜欢发贴,还会回复其他 ID 发的每个帖子.坊间风闻该"水王"发帖数目超过了帖子总数的一半.如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的 ID 也在表中,你能快速找出这个传说中的 Tango 水王吗? 思路:首先想到的是一个最直接的方法,我们可以对所有 ID 进行排序.然后再扫描一遍排好序的 ID 列表,统

1152: 零起点学算法59——找出一个数组中出现次数最多的那个元素

1152: 零起点学算法59--找出一个数组中出现次数最多的那个元素 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 990  Accepted: 532[Submit][Status][Web Board] Description 找出一个数组中出现次数最多的那个元素 Input 第一行输入一个整数n(不大于20) 第二行输入n个整数 多组数据 Output 找出n个整数中出现次数最多的那个整数(

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。 牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。 这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等.问是否可行.牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍.这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次.输入描述: 输入一个正整数N (N <= 50) 接下来一行输入N个正整数,每个数均小于等于1e9. 输出描述: 假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO" 输入例子: 2 1 2 输出例子: YES

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n

判断一个数能否通过一个数组中的数相乘而得到(数组中的数使用次数不限)

题目:判断一个数能否通过一个数组中的数相乘而得到(数组中的数使用次数不限) 例如:第一行输入目标数x,第二行再输入一个数组(每个数用空格隔开),如果能则输出1,不能则输出-1: 输入例1: 20 2 3 5 7 输出: 1 解释:20 = 2*2*5,可以组成,所以输出1. 输入例2: 20 3 5 7 输出: -1 解释:无法组成,所以输出-1. 解题思路:转化成完全背包问题来解决(因为每个因子都可以使用无限次) #include <iostream> #include <bits/s

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if