英伟达笔试题回忆

今天是2013-10-19,去笔试了英伟达(嵌入式工程师),题目很多,试卷发下来13页!!!题目涉及C/C++以及linux的问题,其中还有一道汇编题(不会做)。
因为只会C/C++,所以只做了关于这方面的,有两道题印象深刻(想了很久),其他的要么不记得了要么根本没有看。现在回忆如下,希望后来者有帮助。
其中一道:已知一个自然数S(S>=10)可以分成n个自然数之和,S=a1+a2+.......+an;求一种分法使的a1*a2*......*an最大,写出实现的函数,并数学理论推导一下证明你的算法。


其中一道:已知一个数组Matrica[M][N],按顺时针打印数组,如4*4数组
Matrica[4][4]={ 1,2,3,4
5,6,7,8
2,3,4,6
2,5,7,9}打印成1,2,3,4,8,6,9,7,5,2,2,5,6,7,4,3

参考:http://blog.163.com/huang_zhong_yuan/blog/static/17497528320115304354412/

#include #include void PrintMatrixClockwisely(int** a, int row, int col){ if(a == NULL || row <= 0 || col <= 0) return; int i = 0, j = 0, k = 0; for(i = 0; i < row/2 + row%2; i++){ for(j = i; j < col - i; j++){ cout << a[i][j] << " "; }j--; for(k = i + 1; k < row - i; k ++) cout << a[k][j] << " "; k=row - i - 1; j=col - i - 2; for(; j >= i; j--) cout << a[k][j] << " "; k = row - i - 2; j = i; for(; k >i; k--) cout << a[k][j] << " "; } }int main(){ int i; const int row = 5; const int col = 5; int** a = (int**)(new int[row]); for(i = 0; i < row; i++) a[i] = new int[col]; int k = 1; for(i = 0; i < row; i++){ for(int j = 0; j < col; j++) a[i][j] = k++; } for(i = 0; i < row ; i++){ for(int j = 0; j < col; j++) printf("%4d ", a[i][j]); cout << endl; } PrintMatrixClockwisely(a, row, col); return 1; }

输出:

12345 678910 1112131415 1617181920 2122232425 1 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6 7 8 9 14 19 18 17 12 13


还有一道问答题:虚函数是什么?在C++如何实现?虚函数表如何实现虚函数功能(C)。
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。虚函数可以做到动态绑定,为了实现动态绑定,编译器是通过一个虚函数表,在运行时间接的调用实际上绑定的函数来达到动态绑定。虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。


【英伟达笔试题回忆】有好的思路么?

    推荐阅读