迅雷笔试题---矩阵逆时针旋转90°

昨天去参加了迅雷的笔试,主要分为客观题和主观题,客观题无非就是选择填空,但是很恶心的选择题有多选;主观题就是给个算法题目,让你写出代码。

矩阵的逆时针旋转90°就是一道主观题,并且题目要求不能用额外空间,当时我脑子蒙了,不会,回来搜了一下,但是那个方法太繁琐了,下标操作很复杂,

就算让我看了,然后再写一遍,我估计都比较困难,下边是网上的代码:

/*输入N阶矩阵,逆时针旋转90°*/
#include<stdio.h>
#include<stdlib.h>
#define N 20
int a[N][N];
int main()
{
	int i,k,n,j;
	printf("Enter n<=%d\n",N);
	scanf("%d",&n);//输入阶数
	if(n>N)
	{
		printf("input error\n");
		exit(0);
	}
	for(i=0;i<n;i++)//输入矩阵元素的值
		for(j=0;j<n;j++)
		{
			printf("a[%d][%d]=",i,j);
			scanf("%d",&a[i][j]);
			printf("\n");
		}
		printf("Input the array is:\n");
		for(i=0;i<n;i++)//打印出输入的矩阵
		{
			for(j=0;j<n;j++)
				printf("%4d",a[i][j]);
			printf("\n");
		}
	//
	//第一种方法比较繁琐,不好解决
	/*逆时针旋转90°的算法*/
	for(i=0;i<n/2;i++)/*共有n/2个旋转环*/
		for(k=0;k<n-1-i-i;k++)/*每个旋转环共有n-1-i-i个旋转组,每组4个元素,逐个旋转*/
		{
			/*旋转组4个元素,分别是a[i][k+i],a[k+i][n-1-i],a[n-1-i][n-1-i-k]a[n-1-i=k][i]*/
			int t;
		 	t                =a[i][k+i];
			a[i][k+i]        =a[k+i][n-1-i];
			a[k+i][n-1-i]    =a[n-1-i][n-1-i-k];
			a[n-1-i][n-1-i-k]=a[n-1-i-k][i];
		 	a[n-1-i-k][i]    =t;
		 }
	/*输出旋转后的矩阵*/
	printf("After rotating the array is:\n");
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			printf("%4d",a[i][j]);
		printf("\n");
	}

	system("pause");
	return 0;        
} 


反正我感觉不好记,刚好师妹在旁边,数学功底很强的那种,而且经常跟矩阵之类的打交道,然后我就问了问她,人家连反应都没反应,就说这还不简单,

矩阵主对角线翻转,然后再上下翻转,这让我这师兄顿时惊呆了。。。

废话不多说,上代码,很简单,也不用多记忆!

/*输入N阶矩阵,逆时针旋转90°*/
#include<stdio.h>
#include<stdlib.h>
#define N 20
int a[N][N];
int main()
{
	int i,k,n,j;
	printf("Enter n<=%d\n",N);
	scanf("%d",&n);//输入阶数
	if(n>N)
	{
		printf("input error\n");
		exit(0);
	}
	for(i=0;i<n;i++)//输入矩阵元素的值
		for(j=0;j<n;j++)
		{
			printf("a[%d][%d]=",i,j);
			scanf("%d",&a[i][j]);
			printf("\n");
		}
		printf("Input the array is:\n");
		for(i=0;i<n;i++)//打印出输入的矩阵
		{
			for(j=0;j<n;j++)
				printf("%4d",a[i][j]);
			printf("\n");
		}
//

	//第二种方法,苗苗提供
	//先按主对角线翻转
	for (i = 0; i < n; i++)
	{
		for (j = 0; j <= i; j++)
		{
			int t = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = t;
		}	
	}
	//再上下翻转
	for (k = 0; k < n/2; k++)
	{
		for (i = 0; i < n; i++)
		{
			int t2 = a[k][i];
			a[k][i] = a[n - 1 - k][i];
			a[n - 1 - k][i] = t2;
		}

	}
	/*输出旋转后的矩阵*/
	printf("After rotating the array is:\n");
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			printf("%4d",a[i][j]);
		printf("\n");
	}

	system("pause");
	return 0;        
} 
给个结果图吧 


哎,看来学好数学还是很重要滴~~~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在模拟芯片设计笔试中,选择题通常是考察对于模拟电路和芯片设计相关知识的理解和应用能力。题目的难度和类型可能会有所不同,下面我将简单回答此类题目的一般性特点。 首先,模拟芯片设计选择题往往会涉及到模拟电路的基本概念和理论知识,如放大器、滤波器、振荡器等。我们需要了解各种电路的工作原理、频率响应和稳定性等特性,以及其在芯片设计中的应用。此外,对于模拟电路中的元器件,如电容、电感、二极管和晶体管等,也需要熟悉其特性和工作原理。 其次,模拟芯片设计选择题还可能考察电路的分析和计算能力。例如,给定一个电路图形,要求计算某些电路参数或分析电路的性能。这需要掌握基本的电路分析方法和技巧,如基尔霍夫定律、戴维南-诺顿等效电路等。同时,还需要具备一定的数学基础,能够进行复数运算和解微分方程等。 此外,在模拟芯片设计选择题中,可能会提到一些常用的设计工具和软件,如SPICE软件、面向对象设计和硬件描述语言等。我们需要了解这些工具和软件的原理和使用方法,以及它们在芯片设计中的应用。 总体而言,在模拟芯片设计选择题中,强调对于模拟电路基本概念和理论的理解与应用,同时要求一定的计算和分析能力。为了更好地完成模拟芯片设计笔试题目,我们需要扎实的电路基础和数学基础,并且经常进行习题练习和实际项目实践,提高我们的设计和分析能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值