线上考试平台:【塞码网】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;
}