方正电子的面试
2012年5月16日
上机题:
如下图所示,转圈打印从1到n的平方。
题目大致如此,当时要求有界面,我不会VC的界面,只好用控制台输出。上图是我回来后用Qt做的。我用的解法比较繁琐,直接模拟转圈过程,将过程分成4个方向,类似状态机中的四种状态,满足条件则跳到下一个状态。
核心的代码:
void MainWindow::on_showCircleButton_clicked()
{
QString numqstr = ui->numberEdit->text();
bool flag;
int n = numqstr.toInt(&flag);
if(!flag)
{
// 输入错误
return;
}
else
{
ui->circleBrowser->setText(numqstr);
n = std::abs(n);
int totalnums = n*n;
int numwidth=1;
for(int i=totalnums;i>=10;i/=10,numwidth++);
std::vector<int> arr(totalnums,0);
int curRow = 0;
int curCol = 0;
int curDir = 0; // 方向
for(int i=1;i<=totalnums;i++)
{
int curInd = curRow*n + curCol;
arr[curInd] = i;
switch(curDir)
{
case 0: // 向右
if(curCol==n-1 || arr[curInd+1])
{
curRow++;
curDir = 1;
}
else
curCol++;
break;
case 1: // 向下
if(curRow==n-1 || arr[curInd+n])
{
curCol--;
curDir = 2;
}
else
curRow++;
break;
case 2: // 向左
if(curCol==0 || arr[curInd-1])
{
curRow--;
curDir = 3;
}
else
curCol--;
break;
case 3: // 向上
if(curRow==0 || arr[curInd-n])
{
curCol++;
curDir = 0;
}
else
curRow--;
break;
}
}
std::stringstream ss;
ss.fill('0');
for(int i=0,m=0; i != n; i++)
{
for(int j=0; j!=n; j++,m++)
{
ss.width(numwidth);
ss<<arr[m]<<" ";
}
ss<<"\n";
}
ui->circleBrowser->setText(QString::fromStdString(ss.str()));
}
}应该有简单方法。
笔试题:
考的东西比较零散,绝大部分都是选择题,sizeof必考的内容出了好几道,字符数组常量最后的\0也考了好几道。还有之前没见过的位域(bit-field)问题。
问答题两道,一道说C++中malloc/free和new/delete的区别;另一道则是改错题,关于malloc和memset的使用,这个还真不会。
