autodesk 11.25笔试
写在前面,今年找工作参加的笔试不算太少了,不能怪别人,只能怪自己基础不好,每次笔试总好像脑子迟钝了一样,可是回来再做发现一点都不难。
比如今天的所谓智力题,应该不算的,都是很基本的几何、集合等题,可是我可能很害怕做智力题一样,感觉没作对几题,太遗憾了。
技术题觉得不难,但是纸上写程序可能我始终适应不了,因为我不可能一遍就写对程序,而一遍写下去纸上却不想用编辑器可以随时修改,所以经常想得是对的,却总是写出丢三落四的程序,太恨自己了!!
难道老天对我的所有努力就不屑一顾吗,难道我今年就真的找不到工作了吗??天知道!要不给我机会有种就一直别给我机会!!!!!!!
智力题:
1. 一个集合运算
主要运用公式:
P(A B C)=P(A)+P(B)+P(C)-P(A B)-P(A C)-P(B C) +P(A B C)
2. 有2007个叶子的二叉树最多有多少个节点____4014__
3.已知一个圆桌靠近两墙,桌的边缘存在一点,此点到两墙距离分别为8cm,9cm,请问圆桌的半径__29__
4.有8个硬币,面都朝上,每次翻转时一定要一起翻转8个中的7个,请问要使8个硬币都朝下,至少需要几次_8__
5.洗相片的问题
8个人,每个人都要与其他人组合照相作为留恋,请问一共要洗多少张照片?
技术题:
不要在构造函数和析构函数中调用virtual函数
#include <iostream>
using namespace std;
class Base
{
public:
virtual ~Base(){ foo(); }
virtual void foo() { cout << "Base::foo() called"; }
};
class Derived : public Base
{
public:
virtual ~Derived(){}
virtual void foo() { cout << "Derived::foo() called"; }
};
int main()
{
Derived *d=new Derived;
delete d;
system("PAUSE");
return 0;
}
运行结果:Base::foo() called
总结:
1)对于一个派生类的对象来说,在其基类的构造函数调用的时候,这一对象的类型就是基类的。不仅仅虚函数会解析为基类的,而且 C++ 中使用运行时类型信息的部分(比如 dynamic_cast (参见第 27 条)和 typeid )也会将这个对象的类型看作基类的。
2)当基类的析构函数被调用时,这个对象将成为一个基类对象, C++ 所 有的部分——包括虚函数、 dynamic_cast 等等——都会这样对待该对象。
今天autodesk笔试题出了很多在构造函数和析构函数中做手脚的题,掌握了上面两个规则,则无忧矣!
#include <iostream>
using namespace std;
class Base
{
public:
Base(char a) : c(a){ cout << c << endl; }
private:
char c;
};
class Derived : public Base
{
public:
Derived(char a) : Base(a+1), c(a) { cout << c << endl; }
private:
char c;
};
int main()
{
Derived d('X');
system("PAUSE");
return 0;
}
运行结果:YX
释放内存方法:
1)
int *p=new int;
delete p;
2)
int *p=new int[1024];
delete [] p;
3)
char *p[2];
p[0]=new char;
p[1]=new char;
delete p[0];
delete p[1];
4)
char **p=new char*[2];//如果写成:char **p=new (char*)[2], 语法上error
p[0]=new char[100];
p[1]=new char[200];
delete [] p[0];
delete [] p[1];
delete [] p;
十进制数转八进制数:
#include <iostream>
#include <vector>
using namespace std;
void convert(int N)
{
vector<int> v;
while(N>0)
{
v.push_back(N%8);
N /= 8;
}
cout << "0";
while(!v.empty())
{
cout << v.back();
v.pop_back();
}
}
int main()
{
int num =110;
cout << "(" << num << ")10 Octal num is: (";
convert(num);
cout << ")8";
system("PAUSE");
return 0;
}
大题:
打印螺旋矩阵:
例如 N=4,矩阵为
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
#include <iostream>
using namespace std;
void print_matrix()
{
int N;
cout << "Please Input the dimense: ";
cin >> N;
//分配一个指针数组,其首地址保存在pMatrix中
int **arr = new int*[N];
//为指针数组的每个元素分配一个数组
for (int i = 0; i < N; i++)
arr[i] = new int[N];
int top=0, left=0;
int bottom=N-1, right=N-1;
int num=1;
while(left<=right && top <= bottom)
{
for(int i=left; i<=right; ++i)
{
arr[top][i]=num++;
}
++top;
for(int i=top; i<=bottom; ++i)
{
arr[i][right]=num++;
}
--right;
for(int i=right; i>=left; --i)
{
arr[bottom][i]=num++;
}
--bottom;
for(int i=bottom; i>=top; --i)
{
arr[i][left]=num++;
}
++left;
}
//打印矩阵
for(int i=0; i<N; ++i)
{
for(int j=0; j<N; ++j)
{
cout << arr[i][j] << "\t";
}
cout << "\n";
}
//以下是释放动态分配的空间
for (int i = 0; i < N; i++)
delete [] arr[i];
delete []arr;
}
int main()
{
print_matrix();
system("PAUSE");
return 0;
}
遍历二叉树,并对于每个节点做如下操作:
将节点左指针指向其父节点,将其右指针指向其左子树
要求:非递归(原题没有这个条件)
已知:
struct Node
{Node *left;Node *right;int data;
};
我的做法:利用两个堆栈
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
struct Node
{
char data;
Node * left;
Node * right;
};
enum Tag{goLeft, goRight, goBack };
void Traverse(Node *root)
{
assert(root != NULL);
vector<Node *> vec_node;
vector<Tag> vec_flag;
//init
vec_node.push_back(root);
vec_flag.push_back(goLeft);
while(!vec_node.empty())
{
Node *curNode = vec_node.back();
Tag curFlag = vec_flag.back();
switch(curFlag)
{
case goLeft:
vec_flag.pop_back();
vec_flag.push_back(goRight);
if(curNode->left != NULL)
{
vec_node.push_back(curNode->left);
vec_flag.push_back(goLeft);
}
break;
case goRight:
vec_flag.pop_back();
vec_flag.push_back(goBack);
if(curNode->right != NULL)
{
vec_node.push_back(curNode->right);
vec_flag.push_back(goLeft);
}
break;
case goBack:
vec_flag.pop_back();
vec_node.pop_back();
curNode->right=curNode->left;
curNode->left=vec_node.empty() ? NULL : vec_node.back();
//验证打印输出
cout << curNode->data << "\t";
if(curNode->left != NULL)
{
cout << curNode->left->data << "\t";
}
else
{
cout << "NULL" << "\t";
}
if(curNode->right != NULL)
{
cout << curNode->right->data << "\t";
}
else
{
cout << "NULL" << "\t";
}
cout << endl;
break;
default:
break;
}//switch-end
}//while-end
}
int main()
{
Node root, b, c, d, e, f, g, h;
root.data='a';
root.left=&b;
root.right=&e;
b.data='b';
b.left=&c;
b.right=&d;
c.data='c';
c.left=NULL;
c.right=NULL;
d.data='d';
d.left=NULL;
d.right=NULL;
e.data='e';
e.left=&f;
e.right=&g;
f.data='f';
f.left=NULL;
f.right=NULL;
g.data='g';
g.left=NULL;
g.right=&h;
h.data='h';
h.left=NULL;
h.right=NULL;
cout << "Traverse:\n";
cout << "Node\tleft\tright\n---------------------------\n";
Traverse(&root);
cout << "\n\n";
system("PAUSE");
return 0;
}
输出结果:
更一般的二叉树非递归操作请参见我的总结:http://www.cnblogs.com/chio/archive/2007/10/24/935784.html
一个对象引用计数的问题:
这个题我觉得考的知识非常多,所以特别作为最后一个题来探讨:
涉及的知识点-
- 按值传递对象时到底怎样进行
- 按值返回对象时到底怎样进行
- NRV(Named Return Value)问题
- 临时对象生成
- 对象生命期
- 析构函数自动调用时机
虽然这个涉及问题比较多,而我也一时没有弄清楚。可能还与编译器相关..所以接下来的几天有时间再研究研究