方正电子的面试

目录

上机题:
如下图所示,转圈打印从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的使用,这个还真不会。