笔试编程题

设计一种排序方式,按照数字出现的频率降序排序,频率相同的元素,其排列顺序同他们在给定列表中出现的顺序相同
如:输入 len=5; arr=[1 3 2 1 3]
输出:1 1 3 3 2
int* SortByNum(int* arr, int len)
{
	if(arr == NULL || len <= 0)
		return NULL;
	map<int,int> m;
	vector<int> vec;
	int max = 0;
	for(int i = 0; i< len; i++) //找出出现次数最多的那个赋给max
	{
		++m[arr[i]];
		if(m[arr[i]] > max)
			max = m[arr[i]];
	}
	for(int j = max; j >= 1; j--)
	{
		for(int p = 0; p <len; p++)
		{
			if(m[arr[p]] == j)
			{
				for(int q = 0; q < j; q++)
					vec.push_back(arr[p]);
				m[arr[p]] = 0; //这步很重要,不要漏了,否则会将已打印的部分多打出来
			}
		}
				
	}
	for(int i = 0; i< len; i++)
		arr[i]=vec[i];
	return arr;
}
输入数字n,打印阵列,如输入3
输出:1*2*3
           6*7*8
           4*5*6
void PrintMatrix(int n)
{
	int i = 0, j;
	int** array = new int*[n];
	for(int m = 0; m < n; m++)
		array[m] = new int[n];
	for(int i = 0; i < (n+1)/2; i++)
	{
		j = n-1-i;
		if(i != j)
		{
			for(int k = 1; k <= n; k++)
			{
				array[i][k-1] = 2*i*n + k;
				array[j][k-1] = array[i][k-1]+ n;
			}
		}
		if(i == j)
		{
			for(int k = 1; k <= n; k++)
			{
				array[i][k-1] = 2*i*n + k;
			}
		}
	}
	int p = 0;
	for(; p< n; p++)
	{	
		int q = 0;
		for(; q < n-1; q++)
		{
			cout<<array[p][q]<<"*";
		}
		cout<<array[p][q]<<endl;
	}
	for(int x=0; x < n; x++)
		delete [] array[x];
	delete [] array;

}
本题也可先将数组初始化为顺序的,然后先打印奇数行,再打印偶数行的数
杨辉三角形
void YanHui1(int n, vector<int>& temp)
{
	if(n == 0)
	{
		temp.clear();
		temp.push_back(1);
		return;
	}
	if(n == 1)
	{
		temp.clear();
		temp.push_back(1);
		temp.push_back(1);
		return;
	}
	YanHui1(n-1,temp);
	vector<int> temp1;
	vector<int>::iterator it = temp.begin();
	while(it != temp.end())
	{
		temp1.push_back(*it);
		it++;
	}
	temp.clear();
	for(int i = 0; i <= n; i++)
	{
		if(i == 0 || i == n)
		{
			temp.push_back(1);
			continue;
		}
		/*if(i == n)
		{
			temp.push_back(1);
			break;
		}*/
		temp.push_back(temp1[i-1]+temp1[i]);
	}

}
/*输入n,打印如下矩阵,如n=4
	1
	2*3
	4*5*6
	7*8*9*10
	7*8*9*10
	4*5*6
	2*3
	1
*/
void PrintLike(int n)
{
	for(int i = 1; i<= n; i++)
	{
		int temp = i*(i+1)/2 -i +1;//表示每一行第一个数
		for(int j = 1; j< i; j++)
			cout<<temp++<<"*";
		cout<<temp<<endl;
	}
	for(int i = n; i>0; i--)
	{
		int temp = i*(i+1)/2 -i +1;
		for(int j = 1; j< i; j++)
			cout<<temp++<<"*";
		cout<<temp<<endl;
	}
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值