笔试题-查找唯一相同的整数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 = 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];
		}
	}
}

3 题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【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;
	}
}
时间: 2024-10-02 20:58:24

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

二叉树笔试题

题目:输入两棵二叉树A和B,判断树B是不是A的子结构 bool IsChildTree(Node * father, Node * son) { if(father == NULL && son == NULL) return true; if(father == NULL && son != NULL) return false; if(father != NULL && son == NULL) return true; //如果当前结点相同,判断左右子

C++笔试题汇总(45题)

本文转自:<程序员必看c++笔试题汇总>,经过整理正文如下: 本文通过对程序员笔试过程的总结,对程序员c++笔试题进行了汇总.希望能与大家共同分享.下面是一些常见题型: 1.求下面函数的返回值(微软) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999. 答案:8 思路:将x转化为2进制,看含有的1的个数. 2. 什么是"引用"?申明和使用"引

程序员必看 c++笔试题汇总

本文通过对程序员笔试过程的总结,对程序员c++笔试题进行了汇总.希望能与大家共同分享.下面是一些常见题型: 1.求下面函数的返回值(微软) {   int countx = 0;   while(x)   {   countx ++;   x = x&(x-1);   }   return countx;   }  假定x = 9999. 答案:8 思路:将x转化为2进制,看含有的1的个数. 2. 什么是"引用"?申明和使用"引用"要注意哪些问题? 答:引用

要出发公司笔试题

前言 招聘高峰期来了,大家都非常积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,但是了解不够深.本篇文章为群里的小伙伴们去要出发公司的笔试题,由笔者整理并提供笔者个人参考答案.注意,仅供参考,不代表绝对正确. 参考答案不唯一,大家可以根据自己的理解回答,没有必要跟笔者的一样.参考笔者的答案,也许给你带来灵感! 题目照 1.编程规范问题 这题看不清楚,不过可以看得出来是编程规范问题.所以呢,笔者也就没有办法说明哪些不合理了.不过笔者曾经为公司的出过一个编程规范文档,后

一道用 sizeof 求结构体所占大小的笔试题?求教

问题描述 一道用 sizeof 求结构体所占大小的笔试题?求教 下列程序,为什么输出的结果是 120? int main(int argc, char* argv[]) { union u_type { int i; double x; float f; }; struct str_type { char str[100]; union u_type u[2]; }; printf("%dn",sizeof(struct str_type)); } 解决方案 首先union u_typ

关于java,一道笔试题

问题描述 //请教一个笔试题,:public static void main(String[] args) {// TODO Auto-generated method stubint i= 0xFFFFFFFA;int j=~i;System.out.println(i);System.out.println(j);}/*结果为什么是:-65为什么*/问题补充:我还以为~是取补的意思...原来是取反.. 解决方案 引用int i= 0xFFFFFFFA; 最高位F对应的2进制表示为1111,

JS经典正则表达式笔试题汇总_javascript技巧

本文实例总结了JS经典正则表达式笔试题.分享给大家供大家参考,具体如下: 一.复习字符串的传统操作 如何获取一个字符串中的数字字符,并按数组形式输出,如 dgfhfgh254bhku289fgdhdy675gfh 输出[254,289,675] 分析:循环用charAt()的方法获取到每一个子字符串,判断他是不是在0~9之间,是就把他扔到准备好的数组里 var str="dgfhfgh254bhku289fgdhdy675gfh"; findNum(str); function fin

JS前端笔试题分析_javascript技巧

本文实例分析了JS前端笔试题.分享给大家供大家参考,具体如下: 1.如何根据逗号分隔的字符串创建数组呢?请为下面的字符串创建一个数组,并访问第三个元素:"cats,dogs,birds,horses" 知识点:数组和字符串的转换.考察split() 方法.把一个字符串分割成字符串数组(将字符串按某个字符切割成若干个字符串,并以数组形式返回) var animalString="cats,dogs,birds,horses"; var animalArray=anim

经典算法(9) 从归并排序到数列的逆序数对(微软笔试题)

首先来看看原题 微软2010年笔试题 在一个排列中,如果一对数的前后位置与大小顺序相反 ,即前面的数大于后面的数,那么它们就称为一个逆序数对.一个排列中逆序的总数就称为这个排列的逆序 数.如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定 一数组,要求统计出该数组的逆序数对个数. 计算数列的逆序数对个数最简单的方便就最从前向后依 次统计每个数字与它后面的数字是否能组成逆序数对.代码如下: #include <stdio.h> int ma