笔试题-查找唯一相同的整数3道

简介: 1  数组中数字都两两相同,只有一个不同,找出该数字 #include <iostream>using namespace std;int findUnique(int* a, int len);int findUnique2(int* a, int len);void main(){ int a[] = {1,2,5,3,3,2,1}; int b = fi

1  数组中数字都两两相同,只有一个不同,找出该数字

#include <iostream>
using namespace std;

int findUnique(int* a, int len);
int findUnique2(int* a, int len);
void main()
{
	int a[] = {1,2,5,3,3,2,1};
	int b = findUnique(a,7);
	cout<<b<<endl;
}

//写法一
int findUnique(int* a, int len)
{
	int temp = a[0];
	for (int i = 1; i < len; i++)
	{
		temp ^= a[i];
	}
	return temp;
}

//写法二:
int findUnique2(int* a, int len)
{
	int temp;
	int index = -1;
	bool b;
	int i,j;
	for (i = 0; i < len; i++)
	{
		b = false;
		temp = a[i];
		for (j = 0; j < len; j++)
		{
			if (j != i && temp == a[j])
			{
				b = true;
				break;
			}
		}
		if (b == false)
		{
			index = i;
			return a[index];
		}
	}

	return -1;
}

2 数组中数字两两相同,有两个不同,找出这两个

一问题描述
    一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字。
二 问题分析
     此题实际考察了,对位操作的理解。首先进行简化,考虑只有一个数组中,只存在出现了一次的一个数字,其余数字在数组中出现两次,试找出这个数字。
三 解决方案
   首先 回忆 异或操作,任意数字与自身相异或,结果都为0.
   还有一个重要的性质,即任何元素与0相异或,结果都为元素自身。
   解决方案:
  1 从数组的起始位置开始,对元素执行异或操作,则最后的结果,即为此只出现了一次的元素。
  2 题目中,数组中存在两个不同的元素,若是能仿造上述的解决方案,将两个元素分别放置在两个数组中,然后分别对每个数组进行异或操作,则所求异或结果即为所求。
  3 首先对原数组进行全部元素的异或,得到一个必然不为0的结果,然后判断该结果的2进制数字中,为1的最低的一位。然后根据此位是否为1 ,可以把原数组分为两组。则两个不同的元素,必然分别在这两个数组中。

  4 然后对两个数组,进行异或操作,即可得到所求。

#include <iostream>
using namespace std;

int findUnique(int* a, int len);
void findTwo(int* a, int& one, int& two, int sum,int len);
void main()
{
	int a[10] = {3, 5, 8, 8 ,5, 3, 1, 4, 4, 10};
	int sum = findUnique(a,7);
	int one;
	int two;
	findTwo(a,one,two,sum,10);
	cout<<one<<endl;
	cout<<two<<endl;
}

int findUnique(int* a, int len)
{
	int temp = a[0];
	for (int i = 1; i < len; i++)
	{
		temp ^= a[i];
	}
	return temp;
}

void findTwo(int* a, int& one, int& two, int sum, int len)
{
	unsigned int flag = 1;
	while (flag)
	{
		if (flag & 1)
		{
			break;
		}
		flag <<= 1;
	}

	one = two = 0;
	for (int i = 0; i < len; i++)
	{
		if (a[i] & flag)
		{
			one ^= a[i];
		}
		else
		{
			two ^= a[i];
		}
	}
}

题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,只有1,5,6这三个数字是唯一出现的,我们只需要输出1,5,6中的一个就行。

#include <iostream>
using namespace std;

int findUnique(int* a, int len);
int findOnly(int* a, int sum, int len);
void main()
{
	int a[7] = {1,2,4,5,6,4,2};
	int sum = findUnique(a,7);
	int num = findOnly(a,sum,7);
	cout<<num<<endl;
}

int findUnique(int* a, int len)
{
	int temp = a[0];
	for (int i = 1; i < len; i++)
	{
		temp ^= a[i];
	}
	return temp;
}

int findOnly(int* a, int sum, int len)
{
	unsigned int flag = 1;
	while (flag)
	{
		if (flag & 1)
		{
			break;
		}
		flag <<= 1;
	}

	int one,two,countOne,countTwo;
	one = two = countOne = countTwo = 0;
	for (int i = 0; i < len; i++)
	{
		if (a[i] & flag)
		{
			one ^= a[i];
			countOne++;
		}
		else
		{
			two ^= a[i];
			countTwo++;
		}
	}

	if (countOne & 1)
	{
		return one;
	}
	else
	{
		return two;
	}
}

目录
相关文章
|
2月前
|
C语言
二分查找法的区间判断【C语言】
二分查找法的区间判断【C语言】
|
4月前
|
Java C++ Python
试题 基础练习 查找整数
试题 基础练习 查找整数
15 0
|
10月前
|
C语言
C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))
题目: 有一个数字矩阵(二维数组), 矩阵的每行从左到右是递增的, 矩阵从上到下是递增的, 请编写程序在这样的矩阵中查找某个数字是否存在, 要求:时间复杂度小于O(N)。
229 1
|
5月前
|
Java 测试技术 Python
每日一题《剑指offer》字符串篇之表示数值的字符串
每日一题《剑指offer》字符串篇之表示数值的字符串
28 0
每日一题《剑指offer》字符串篇之表示数值的字符串
|
5月前
蓝桥杯-基础练习 查找整数
蓝桥杯-基础练习 查找整数
41 0
|
5月前
剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
20 0
|
10月前
|
C语言
【C语言】在有序数组中查找某个特定的值(二分查找法)
【C语言】在有序数组中查找某个特定的值(二分查找法)
100 0
|
11月前
|
C语言
C语言:整形有序数组中查找具体的某个数(二分查找)
有的人会问,在一个整形的有序数组中,来查找具体的某个数,直接用下面代码就可以了,还有要用什么二分查找,说的有理,但是,下面的那种代码效率不高,
52 0
|
11月前
|
存储
剑指Offer - 面试题17:打印从1到最大的n位数
剑指Offer - 面试题17:打印从1到最大的n位数
50 0
|
12月前
|
算法 C语言
C语言 PTA刷题(数组判重并输出重复元素以及个数)
C语言 PTA刷题(数组判重并输出重复元素以及个数)
C语言 PTA刷题(数组判重并输出重复元素以及个数)