首页 > 编程语言 > 详细

数组面试题

时间:2014-12-28 23:34:19      阅读:248      评论:0      收藏:0      [点我收藏+]

数组面试题

#include<iostream>
using namespace std;
//数组求和
int sum(int *a, int n)
{
	return n == 0 ? 0 : sum(a, n - 1) + a[n - 1];
}
//递归法数组求和
int sum2(int *a, int n)
{
	int s = 0;
	for (int i = n - 1; i > 0; i--){
		s += a[i];
	}
	return s;
}
//求数组的最大最小值
void Max_Min(int *a, int n, int &max_value, int &min_value)
{
	max_value = a[0];
	min_value = a[0];
	for (int i = 0; i < n; i++){
		if (a[i] > max_value)
			max_value = a[i];
		if (a[i] < min_value)
			min_value = a[i];
	}
}
//求数组中出现次数超过一半的元素
int halftime_val(int *a, int n)
{
	typedef struct valuetype{
		int num;
		int time;
	}value;
	int target_val = -1;
	value* data = new value[n];

	for (int i = 0; i < n; i++) //统计数组元素出现的次数
	{
		data[i].num = a[i];
		data[i].time = 1;
		for (int j = 0; j < i; j++){
			if (data[i].num == data[j].num)
				data[i].time++;
		}
	}
	for (int i = 0; i < n; i++){
		if (data[i].time > n / 2){
			target_val = data[i].num;
		}
	}
	delete data;
	return target_val;
}

// 找出数组中出现次数超过一半的元素
int Find(int* a, int n)
{
	int curValue = a[0];
	int count = 1;

	for (int i = 1; i < n; ++i)
	{
		if (a[i] == curValue)
			count++;
		else
		{
			count--;
			if (count < 0)
			{
				curValue = a[i];
				count = 1;
			}
		}
	}

	return curValue;
}

//求数组中距离最小的两点
//给定一个含有n个元素的整型数组,找出数组中的两个元素x和y使得abs(x - y)值最小
//先对数组排序,然后遍历一次即可
int compare(const void* a, const void* b)
{
	return(*(int*)a - *(int*)b);
}
void Min_Distance(int *a, int n)
{
	qsort(a, n, sizeof(int), compare);
	int min_distace = 0;
	int temp = 0, x1 = 0, x2 = 0;
	min_distace = a[1] - a[0];
	for (int i = 1; i < n - 1; i++)
	{
		temp = abs(a[i + 1] - a[i]);
		if (temp < min_distace)
		{
			min_distace = temp;
			x1 = a[i + 1];
			x2 = a[i];
		}
	}
	cout << min_distace << endl;
	cout << x1 <<" "<< x2 << endl;
}
//求两个有序数组的共同元素
/*
给定两个含有n个元素的有序(非降序)整型数组a和b,求出其共同元素,比如
a = 0, 1, 2, 3, 4
b = 1, 3, 5, 7, 9
输出 1, 3
***************************************************************
分析:充分利用数组有序的性质,用两个指针i和j分别指向a和b,比较a[i]和b[j],根据比较结果移动指针,则有如下三种情况

1. a[i] < b[j],则i增加1,继续比较
2. a[i] == b[j],则i和j皆加1,继续比较
3. a[i] < b[j],则j加1,继续比较
重复以上过程直到i或j到达数组末尾。
*/
void Find_Commom1(int *a, int *b, int n)
{
	int i = 0, j = 0;
	while (i < n && j < n){
		if (a[i] < b[j]) i++;
		if (a[i] == b[j]){
			cout << a[i] << " ";
			i++;
			j++;
		}
		if (a[i] > b[j]) j++;
	}
	cout << endl;
}
void Find_Commom(int* a, int *b, int n)
{
	int i, j;
	for (i = 0; i < n; i++){
		for (j = 0; j < n; j++){
			if (a[i] == b[j])
				cout << a[i] << " ";
		}
	}
	cout << endl;
}

int main()
{
	int a[4] = { 2, 4, 6, 8 };
	int b[5] = { 1, 5, 7, 9 };
	Find_Commom(a, b, 4);
	Find_Commom1(a, b, 4);
}

  来自:http://www.cnblogs.com/graphics/archive/2010/08/24/1761620.html#

数组面试题

原文:http://www.cnblogs.com/mrethan/p/4190742.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!