2011.10.18百度面试-人生第一次面试

        下午16:30,带着那不堪入目的简历,怀着忐忑的心情来到了百瑞大酒店20层,开始了人生的第一次面试。

        面试官很随和,上来就让我先介绍下自己的情况。说完了,他可能感觉到了我的紧张,很亲切的来了一句“ok,那我们先来写一道程序题”。“用栈模拟队列”,想都没怎么想清楚,直接写了一个用两个栈来模拟。但是写完后,面试官说,那些方法呢?我纳闷了,我没有把队列的那个方法写下来,随后,急急忙忙写了一下。不过,这一次,时间大概只用了5分钟吧,面试官看了一眼,就道出这个程序的致命弱点,复杂度太高了,每一次操作都得把所有元素出栈和入栈。本来想改的,但是面试官说,这样可以了,我们继续下一题。(面试完后,出了大楼,想了一个比较好的办法。)

#include <iostream>
#include <stack>
using namespace std;
class Myqueue{
	stack<int> s1, s2;
	bool flag;
public:
	void push(int a);
	int front();
	void pop();
	Myqueue(){
		while(!s1.empty())
			s1.pop();
		while(!s2.empty())
			s2.pop();
		flag = 0;
	}
	~Myqueue(){};
};

void Myqueue::push(int a){
	if(!flag){
		s1.push(a);
	}
	else{
		while(!s2.empty()){
			s1.push(s2.top());
			s2.pop();
		}
		s1.push(a);
		flag = flag^1;
	}
}

int Myqueue::front(){
	if(flag){
		return s2.top();
	}
	else{
		while(!s1.empty()){
			s2.push(s1.top());
			s1.pop();
		}
		flag = flag^1;
		return s2.top();
	}
}

void Myqueue::pop(){
	if(flag){
		s2.pop();
	}
	else{
		while(!s1.empty()){
			s2.push(s1.top());
			s1.pop();
		}
		flag = flag^1;
		return s2.pop();
	}
}

Myqueue Q;

int main(){
	Q.push(1);
	Q.push(2);
	Q.push(3);
	cout<<Q.front()<<endl;
	Q.pop();
	Q.push(1);
	cout<<Q.front()<<endl;
	Q.pop();
	cout<<Q.front()<<endl;
	Q.pop();
	cout<<Q.front()<<endl;
}

第二题是一个智力题。房间里面100盏灯,标号从1到100,每盏灯有一个开关。现在有100个人,每个人的编号也从1到100。每个人进入房间,将房间内标号为自己编号的倍数的灯的状态改变一下。100个人之后,所有灯的情况。起先灯都是关闭的。想了大概1分钟,自己模拟了几个,感觉是n^2的数都是开的,原因很简单,一个数X分解,假若不是平方数,必然存在a * b = X , X % a == 0 && X % b == 0 && a != b,这样,这些数必然被改变2的倍数次。
测试代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main(){
	int a[101];
	memset(a, 0 ,sizeof(a));

	int i, j;
	for(i = 1; i <= 100; ++i){
		for(j = 1; i * j <= 100; ++j){
			a[i * j] = a[i * j] ^ 1;
		}
	}

	for(i = 1; i <= 100; ++i){
		if(a[i])
			printf("%d\n", i);
	}
	return 0;
}

第三题问如何判断一个单链表是否存在一个环。以前做过,很轻松回答了:快慢指针和地址hash两种方法。(1)有两种指针,一种是每次取当前元素的下一个,另外一种是去当前元素的下一个的下一个,若无环,则快指针会存在一个不合法的内存地址。若有环,则某一时刻,两个指针指向同一块内存地址。(2)这个就不用说了。就是看内存是否被用过。这个方法要更大的额外内存。

第四题,TCP/IP协议工作原理。表示不会,上课没听过,课后也没补习,弱爆了我。


第五题,操作系统。简述线程和进程。还是一样,以前精力都放ACM上了,这些就没好好看过,后悔ing。土一点讲,进程是程序的运行过程,是系统进行资源分配和调度的一个独立单位。而线程是进程一个实体,是CPU调度和分配的基本单位。一个进程至少有一个线程。(未完成)

第六题,写一个不能被继承的类。具体原理见狗哥blog http://blog.sina.com.cn/s/blog_8713d5b20100u0ij.html

#include <iostream>
using namespace std;

class A{
private:
	A(){};
	~A(){};
};
class B:public A{
public:
	B(){};
	~B(){};
};
int main(){
	B tt;
	return 0;
}

第七题,c++中结构体和类的区别。struct默认的访问属性是public的,class默认访问属性是private的。(还有其他的吗?欢迎补充)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值