名企招聘c++程序员笔试题
单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。
最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:
struct linka {
int data;
linka* next;
};
void reverse(linka*& head) {
if(head null)
return;
linka *pre, *cur, *ne;
pre=head;
cur=head->next;
while(cur)
{
ne = cur->next;
cur->next = pre;
pre = cur;
cur = ne;
}
head->next = null;
head = pre;
}
还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为null。因为要改变head指针,所以我用了引用。算法的源代码如下:
linka* reverse(linka* p,linka*& head)
{
if(p null || p->next null)
{
head=p;
return p;
}
else
{
linka* tmp = reverse(p->next,head);
tmp->next = p;
return p;
}
}
②已知string类定义如下:
class string
{
public:
string(const char *str = null); // 通用构造函数
string(const string &another); // 拷贝构造函数
~ string(); // 析构函数
string & operater =(const string &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
尝试写出类的成员函数实现。
答案:
string::string(const char *str)
{
if ( str null ) //strlen在参数为null时会抛异常才会有这步判断
{
m_data = new char[1] ;
m_data[0] = '''' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}
}
string::string(const string &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}
string& string::operator =(const string &rhs)
{
if ( this &rhs)
return *this ;
delete []m_data; //删除原来的数据,新开一块内存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}
string::~string()
{
delete []m_data ;
}
1.求下面函数的返回值(微软)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 答案:8
思路:将x转化为2进制,看含有的1的个数。
2. 什么是“引用”?申明和使用“引用”要注意哪些问题?
答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的'时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。
3. 将“引用”作为函数参数有哪些特点?
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
-
男生面试西装忌讳
一、忌西裤短,标准的.西裤长度为裤管盖住皮鞋;二、忌衬衫放在西裤外;三、忌衬衫领子太大,领脖间存在空隙;四、忌领带颜色刺目;五、忌领带太短,一般领带长度应是领带尖盖住皮带扣;六、忌不扣衬衫扣就佩戴领带;七、忌西服上衣袖子过长,它应比衬衫袖短1厘米;八、忌西服的上衣...
-
洋考试催热国内培训 GRE、GMAT迎春季培训旺季
“烤鸡”、“考鸭”加“考托”,暗潮涌动的留学大军早已悄悄开始了新一轮的备战。记者走访深圳市多家提供出国考试培训项目的机构,得知大部分学生们都把这个寒假作为自己充电加油的好时机,希望在日益激烈的留学竞争中脱颖而出。深圳新东方的GRE培训课堂座无虚席...
-
面试,道不同不相为谋。
面试,是求职者走向职业生涯的第一步,而要闯过“面试”这道关,对于求职者来说,不仅要有出众的学识、多种的技能、引以为自豪的学历等等应当具备的基本面试能力外,而且还得具备面试技巧。记得几年前我在各面试,是求职者走向职业生涯的第一步,而要闯过“面试”这道关,对于...
-
咖啡师培训的诱惑
调配、制作咖啡也能成为一项专门的职业,而且手艺精湛的咖啡师月薪超过万元。4月底劳动和社会保障部向社会发布的第六批14个新职业中,咖啡师正式进入职业领域。目前国内所有涉外旅游指定星级宾馆、饭店都设有咖啡的专营场所,甲级写字楼、大专院校、大型商场、高档...