【美图 - 计算机视觉岗】2018 年在线笔试考点:选择 + 编程(顺时针旋转数组90°)

线上考试平台:【塞码网】http://www.acmcoder.com/index

计算机视觉岗位,题型:选择题(25题) + 编程题(1题)

时间:1个小时(2018年4月12日,晚上19:00~20:00)


选择题考点(欢迎补充...)

1)机器学习中常见的分类算法:Linear Regression、Logistic Regression、SVM、Decision Tree、K-NN、Naive Bayes、Boosting、Random Forest;哪些属于线性分类器(有感知机,LDA,逻辑斯特回归,线性核SVM)

2)二叉树:已知中序遍历和后续遍历,画出完整的二叉树;

3)计算矩阵的特征值及其对应的特征向量;

4)计算图像所占内存量:已知一张彩色bmp图像size=640x480,深度为8,求该图像所占内存byte;

5)高斯滤波器(3x3),采用行列分离的方法对一张M*N的图像做卷积,求所需计算乘法的次数;

6)循环队列[0, 1, 2 ... ...m-1],队首为front、队尾为rear,求队列长度;

7)已知 m<n<p<q,矩阵A, B, C的大小分别为m*n, n*p, p*q,求最有效率的组合如,(AB)C;

8)C++中,哪些操作会使得代码膨胀:宏定义、模板、内联函数;

9)范式:L0, L1, L2, L_max;

10)线程和进程:同一个进程下的线程能够共享哪些东西(堆、栈、进程ID、进程代码段)



编程题:

题目的意图很明显,就是对一个矩阵顺时针旋转90°,数组大小为N*N(N未知,需要自己获取)

注意点:

1)矩阵初始化:将测试数据输入,并赋值到矩阵中;

2)元素值范围为[0, 255],当元素值为两位数的时候(大于9),该如何处理?

3)不使用额外的数据结构、尽量不占用额外的内存;


刚开始做的时候,只考虑到元素值为[0, 9]的情况:因为是通过 char 来存储用户输入的值,会将如12的数值拆分为1和2;后来寻思了一会儿,发现将char改为int就行了= =!!!  略显尴尬...

#include <iostream>
#include <algorithm>

using namespace std;

#define MAX_NUM 1010
int a[MAX_NUM][MAX_NUM];
int result[MAX_NUM][MAX_NUM];
int N = 0;

void input(){
	
    int temp;
    
    do{
        cin >> temp;
		a[0][N] = temp;
        N++;
    }while(cin.get() != '\n');
    
    
    for(int i=1; i<N; i++){
    	for(int j=0; j<N; j++){
    		cin>>a[i][j];
		}
	}
	
}

void display(){  
      
      
    for(int i=0; i<N; i++){
    	for(int j=0; j<N; j++){
    		cout<<result[i][j]<<" ";
		}
		cout<<endl;
	}
    cout<<endl;   
}  

int excute(){
	
	// 原矩阵的第一行等于旋转90度后的最后一列 
	
	// 花费空间 
//	int temp; 
//	for(int i=0; i<N; i++){
//    	for(int j=0; j<N; j++){
//    		result[j][N-1-i] = a[i][j];
//		}
//	}
//	display();
	
	// 节省空间,直接输出
	for(int i=0; i<N; i++){
    	for(int j=0; j<N; j++){
    		cout<<a[N-1-j][i]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
} 

int main(){
	
	input();
	excute();
	
	return 0;
}

本人还有另一种做法,也是试卷上提交的作法,只有35%左右的准确率,也是因为只能处理元素值在[0, 9]范围,如下所示:

注意点:

1)vector<vector<int> > 参考:https://blog.csdn.net/u013068755/article/details/70198924

2)#include <sstream> 参考:https://blog.csdn.net/Houchaoqun_XMU/article/details/79587420

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<vector<int> > image;
	string s;
	int n;
	
	getline(cin, s);
	n = (int) (s.size() + 1) / 2;
	vector<int> row;
	
	for (int i=0; i<s.size(); i++)
	{
		if (s[i] != ' ')
		{
			row.push_back(s[i] - '0');
		}
	}
	
	image.push_back(row);
	
	for (int i = 0; i < n - 1; i++)
	{
		getline(cin, s);
		row.clear();
	 
		for (int i=0;i<s.size();i++)
		{
			if (s[i] != ' ')
			{
	       	row.push_back(s[i] - '0');
	    	}
		}
	 
		image.push_back(row);
	}
	
	for (int i = 0; i < n; i++)
	{
		for (int j = n - 1; j >= 0; j--)
		{
	    	cout << image[j][i] << ' ';
		}
	 
		cout << endl;
	}
	
	return 0;
}

改进后,能够适用于元素值大于等于10的情况,思路:

1)使用字符串流(#include <sstream>)分割用户输入的空格“ ”;

2)使用字符串流(#include <sstream>)将字符串转化为数字

#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

int main()
{
	vector<vector<int> > image;
	string s;
	string temp;
	int n = 0;
	vector<int> row;

	getline(cin, s);
	stringstream str_split(s);
	
	while(getline(str_split, temp, ' ')){
		// convert str to digit
		stringstream str2digit;
		int str2num;
		str2digit << temp;
		str2digit >> str2num;
		
	 	row.push_back(str2num);
        n++;  
    }
	
	
	image.push_back(row);
	
	for (int i = 0; i < n - 1; i++)
	{
		getline(cin, s);
		row.clear();
		stringstream str_split(s);
		
		while(getline(str_split, temp, ' ')){
			
			// convert str to digit
			stringstream str2digit;
			int str2num;
			str2digit << temp;
			str2digit >> str2num;
			
		 	row.push_back(str2num);
	    }
	 
		image.push_back(row);
	}
	
	for (int i = 0; i < n; i++)
	{
		for (int j = n - 1; j >= 0; j--)
		{
	    	cout << image[j][i] << ' ';
		}
	 
		cout << endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Houchaoqun_XMU/article/details/79919675