CVTE2016校招试题摘选

今年的题分两部分,时间为晚上7:00-9:30,题目分不定项选择与两道编程题。

下面是我自己抄下来的一部分题,尽飨读者。

1.堆排序属于下面哪种排序方法?

A、选择排序 B、插入排序、C、交换排序 D、归并排序

答案: A

2. 用RSA算法加密时,已知公匙是(e=7,n=20),私匙是(d=3,n=20),用公匙对消息M=3加密,得到的密文是?

A . 13     B.12     C.19      D.7

答案:D

解析:

 n=20
e=7 公钥
d=3 私钥
对M=3 进行加密
M'=M^e%n (M的e次方,然后除以n取余数)
M'=3^7%20=2187%20=7 加密后等于7

对M'=7进行解密
M=M'^d%n=7^3%20=343%20=3 解密后又变成3了

因此答案是D

3.编程题:

已知一个二维数组n*n,我们希望二维数组的每一位均>=右边的数,同时也>=下面的数,请编写函数调整数组,使之满足要求(边界除外)。

如: A=

        10 5   0 

        4  6   1 

        2  3    7   

调整后:

      10   6   5

      7    4   3

      2    1    0

解析:
    我用了两种办法,一种不动脑筋的,直接将上面从大到小按照从左往右,从上往下的顺序填写即可。排序时间复杂度为O(n^2log(n^2))

第二种办法:对每一行从大到小排序,然后每一列从大到小排序,即可。时间复杂度为O(n^2logn),稍好一些,应该还有其它的方法。这个问题的答案不唯一啊。

方法一、

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void RecombineArray(int* a, int n)
{

	
	sort(a,a+n*n,std::greater<int>());

	
}
int main()
{
	int a[3][3] = { { 10, 5, 0 }, { 4, 6, 1 }, { 2, 3, 7 } };
	RecombineArray2((int*)a,3);
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

注:由于二维数组存储正好是按照从上往下,从左往右的顺序存储,所以二维数组很容易拉成一维数组,然后按照一维数组的方式对其正常排序即可


方法二、

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

void RecombineArray(int* a, int n)
{

	for (int i = 0; i < n;i++)//对行从大到小排序
	{
		sort(a+n*i,a+n*i+n, std::greater<int>());
	}

	for (int j = 0; j < n;j++)//对列从大到小排序
	{
		vector<int> temp;
		temp.reserve(n*n);
		for (int i = 0; i < n;i++)
		{
			temp.push_back(*(a + n*i + j));
		}
		sort(temp.begin(),temp.end(), greater<int>());
		for (int i = 0; i < n; i++)
		{
			*(a + n*i + j) = temp[i];
		}
	}

	
}

int main()
{
	int a[3][3] = { { 10, 5, 0 }, { 4, 6, 1 }, { 2, 3, 7 } };
	RecombineArray((int*)a,3);
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}



   

你可能感兴趣的:(校招)