整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
2016-12-10 20:46
966 查看
整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
下面是用c语言实现的方法:
如果是每个元素均出现k次的话,除了一个元素例外,如何找出这个元素?
考虑每个元素的为一个32位的二进制数,这样每一位上出现要么为1 ,要么为0。对数组,统计每一位上1 出现的次数count,必定是kN或者kN+1 次。让count对k取模,能够获得到那个只出现1次的元素该位是0还是1。
例如k等于3的时候,实现方法如下:
int singleNumber(int arr[], int n)
{
int result = 0;
for(int i = 0; i < 32; i++)
{
int count = 0;
int mask = 1 << i;
for(int j = 0; j < n; j++)
{
if(arr[j] & mask)
{
count++;
}
}
if(count % 3)
{
result |= mask;
}
}
return result;
}
网上还有其他的一种算法可以进行参考:
int singleNumber(int A[], int n)
{
int one = 0, two = 0;
for (int i = 0; i < n; i++)
{
two |= A[i] & one;
one ^= A[i];
int three = one & two;
one &= ~three;
two &= ~three;
}
return one;
}
int singleNumber(int arr[], int n) { printf("n = %d\n",n); int result = 0; for(int i=0; i < n; i++) { result ^= arr[i]; } return result; }
下面是用c语言实现的方法:
#include<stdio.h> #include<string.h> int singleNumber(int arr[], int n) { int result = 0; for(int i=0; i < n; i++) { result ^= arr[i]; } return result; } void main() { int arr[5]; int single_Num ; printf("please input array number:\n"); for(int i = 0; i < 5; i++) scanf("%d", &arr[i]); for(i = 0; i < 5; i++) printf("arr[%d]=%d \n",i, arr[i]); single_Num = singleNumber(arr, 5); printf("single number is:%d\n",single_Num); }
如果是每个元素均出现k次的话,除了一个元素例外,如何找出这个元素?
考虑每个元素的为一个32位的二进制数,这样每一位上出现要么为1 ,要么为0。对数组,统计每一位上1 出现的次数count,必定是kN或者kN+1 次。让count对k取模,能够获得到那个只出现1次的元素该位是0还是1。
例如k等于3的时候,实现方法如下:
int singleNumber(int arr[], int n)
{
int result = 0;
for(int i = 0; i < 32; i++)
{
int count = 0;
int mask = 1 << i;
for(int j = 0; j < n; j++)
{
if(arr[j] & mask)
{
count++;
}
}
if(count % 3)
{
result |= mask;
}
}
return result;
}
网上还有其他的一种算法可以进行参考:
int singleNumber(int A[], int n)
{
int one = 0, two = 0;
for (int i = 0; i < n; i++)
{
two |= A[i] & one;
one ^= A[i];
int three = one & two;
one &= ~three;
two &= ~three;
}
return one;
}
相关文章推荐
- 一个整数数组,每个数字都出现K次,只有一个数字出现M次,找出这个数字(线性时间)
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 取值为[1,n-1]含n个元素的整数数组,至少存在一个重复数,即可能存在多个重复数,O(n)时间内找出其中任意一个重复数,不使用额外存储空间。
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- leetcode:给定一个整数数组,除了一个元素外,每个元素都会出现两次。找到那一个。
- 一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 给定整数数组,除了一个元素之外,每个元素都会出现两次。 找到那个只出现一次的
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 如何快速找出一个数组中只出现一次的两个数,其他元素出现两次?保证时间复杂度O(n),空间复杂度O(1)
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n), 空间复杂度是O(1)
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 136. 整数数组,每个数均出现两次,唯独一个数出现一次。找出该数。
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 给定整数数组,除了一个元素之外,每个元素都出现三次。 找到那个只出现一次的数
- 1、在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。设计一个算法,找出出现次数最多的数字。