您的位置:首页 > 职场人生

程序员面试题目总结--数组(一)【递归求数组所有元素和、用一个for循环打印出一个二维数组、用递归判断数组是否是递增、有序数组中删除重复元素】

2014-07-29 10:16 916 查看
1、给定一个含有n个元素的整型数组a,求a中所有元素的和(递归实现)

题目:给定一个含有n个元素的整型数组a,求a中所有元素的和(递归实现)

分析:如果元素个数为0,则和为0;如果数组元素个数为n,那么先求出前n-1个元素之和,再加上a[n-1]即可

int GetSum(int a[], int n)
{
	return n==0 ? 0 : GetSum(a,n-1)+a[n-1];
}

2、用一个for循环打印出一个二维数组

题目:用一个for循环打印出一个二维数组

分析:只使用一次for循环,这就需要知道二维数组在内存中是按照行存储方式存储的,所以可以将二维数组看成一个一维数组

//用一个for循环打印出一个二维数组
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;

int main()
{
	int m,n;
	cout << "请输入行和列:" << endl;
	cin >> m >> n;
	vector<vector<int> > vec(m,vector<int>(n));
	for(int i=0; i<m ;i++)
		for(int j=0;j< n;j++)
			vec[i][j]=i*j;

	cout << "两次for循环:" << endl;
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
			cout<<setw(5)<<vec[i][j];
		cout<<endl;
	}

	cout << "一次for循环:" << endl;
	for(int i=0;i<m*n;i++)
	{
		cout << setw(5) << vec[i/n][i%n];
		if((i+1)%n == 0)
			cout << endl;
	}
/************************************************************************/
/* 三维数组时:
   如 int a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}}};
	  for(int i=0;i<12;i++)
	      cout << a[i/6][(i/3)%2][i%3] << endl;
/************************************************************************/
}

3、用递归算法判断一个数组是否是递增

题目:判断一个数组是否是递增(递归)

分析:

(1)如果数组长度为1,则该数组递增,返回true

(2)如果数组长度为n(n>=2),则先比较最后两个元素是否递增,如果最后两个元素递增,则再递归比较除去最后一个元素的前n-1个元素是否递增

bool isIncrease(int a[], int n)
{
	if(n<=1)
		return true;
	return (a[n-1] >= a[n-2]) && isIncrease(a,n-1);
}


4、有序数组中删除重复元素(每个元素只能出现一次)

题目:给定一个排序过的数组,要求in
place的移除重复元素,返回处理后的数组长度

例:1 1 1 1 2 2 2 3 =====> 1 2 3

方法1:

int RemoveDuplicate(int a[], int n) 
{
	if (n == 0) return 0;
	int index = 0;
	for (int i = 1; i < n; i++) 
	{
		if (a[index] != a[i])
			a[++index] = a[i];
	}
	return index + 1;
}
方法2:使用STL
int RemoveDuplicate(int a[], int n) {
	return distance(a, unique(a, a + n));
}

5、有序数组中删除重复元素(上题的变型,这里元素至多可以重复两次)

题目:给定一个排序过的数组,要求in
place的移除重复元素,返回处理后的数组长度(元素至多可以重复两次)

例:1 1 1 1 2 2 2 3 =====> 1 1 2 2 3

方法1:

分析:维护一个counter,当counter是2时,就直接跳过即可,否则说明元素出现次数没有超,继续放入结果数组,若遇到新元素则重置counter。

当counter为3时,这样元素至多可以重复3次

int RemoveDuplicate(int a[], int n)
{
	if(a==NULL || n==0)
		return 0;
	int idx = 0;
	int count = 0;
	for(int i=0;i<n;i++)
	{
		if(i>0 && a[i]==a[i-1])
		{
			count++;
			if(count>=3)
				continue;
		}
		else
		{
			count = 1;
		}
		a[idx++]=a[i];
	}
	return idx;
}
方法2:

下面是一个简洁版本,上面的方法容易扩展,只需将counter改为3时,这样元素至多可以重复3次。

int RemoveDuplicate1(int a[], int n)
{
	if(a==NULL || n==0)
		return 0;
	if(n<=2) return n; 
	int count=2;
	int index=count;
	for(int i=count;i<n;i++)
	{
		if(a[i]!=a[index-count])
			a[index++]=a[i];
	}
	return index;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐