打怪升级

在不断积累中进步,总有一天我会卷土重来!

一、CVTE面试经历

一面:

1.判断一个数为素数。

写了一个最简单的。

bool IsSuShu(int num)
{
	if (num < 2) return false;
	for (int i = 2; i < num; i++)
	{
		if (num % i == 0) return false;
	}
	return true;
}

然后问可以怎么优化?

可以先判断是否为偶数,如果不是,除数只能是奇数了。

bool IsSuShu(int num)
{
	if (num < 2) return false;
	if (num == 2) return true;
	if (num % 2 == 0) return false;
	for (int i = 3; i < num; i = i + 2)
	{
		if (num % i == 0) return false;
	}
	return true;
}

接着问可不可以这样?

bool IsSuShu(int num)
{
	if (num < 2) return false;
	if (num == 2) return true;
	if (num % 2 == 0) return false;
	for (int i = 3; i < sqrt(num); i = i + 2)
	{
		if (num % i == 0) return false;
	}
	return true;
}
接着问不使用库函数,怎样判断这个条件:

i < sqrt(num)

后来才想到可以这样:

(i*i)<num

2.二分查找。

3.判断单链表是否有环。

4.单链表反转。(思路)

1->2->3->4->5

令p=2,q=3.

当q->next不为空时

        r=q->next;

        q->next=p;

        p=q;

        q=r;

5.一个函数调用另一个函数,怎样让两个函数共享内存?

可以用static变量、返回引用、传递引用。这三种的缺点。

static:会分配内存,知道程序退出才释放。

传递引用:在函数调用时,会进行入栈出栈操作。

返回引用:如果在被调用函数内部new的内存被返回后,可能忘记释放造成泄漏。

6.多态的实现,vtpr,vtbl的存储结构。

二面:

1.项目各种问题

2.根据前序和中序构建二叉树。



二、腾讯面试经历

电话面试:

1.tcp三次握手,四次挥手。

2.构造函数能不能是虚函数。

3.epoll的两种模式

4.select的缺点。

5.time_wait的作用,如果time_wait太多会怎样,怎样不使用time_wait功能。

1)作用

可靠实现TCP全双工的连接的终止:主动关闭的socket端会进入time_wait状态,并且持续2msl(最大分节生命期,这是一个IP包能在互联网上存在的最长时间)时间长度。如果第四次挥手时,客户端发送给服务器端的ACK丢失,服务器将重新发送FIN,因此客户端为time_wait状态允许其重新发送ACK。如果不维持这个状态,那么客户端将相应RST分节,服务器将此分节响应成一个错误。

允许老的重复分节在网络中消逝:TCP不允许处于time_wait状态的连接启动一个新的化身(具有相同IP和端口号的连接),因为time_wait持续时间为2msl,可以保证建立一个TCP连接时,来自连接先前化身的重复分组已经在网络中消失。

2)time_wait太多的弊端

对于一个处理大量短连接(连接的时间很短就断开)的服务器,如果由服务器主动关闭连接,将导致服务器存在大量处在time_wait状态的socket,严重影响服务器的处理能力,甚至耗尽可用的socket和端口,

3)怎样关闭time_wait功能。

使用STCP没有time_wait功能。


6.C/C++有哪些内存区。

7.有100本书,两个人拿,每个人每次只能拿1-5本,如果让你先拿,你怎样保证拿到最后一本?

8.stl里面迭代器设计的思想是什么?

9.map的数据结构是什么,有什么特点?map的erase函数返回类型是什么?


三、腾讯一面

一面:
自我介绍完后,看到面试官拿出两张纸的题目出来问我,吓尿了!!
1.多进程和多线程的优缺点。
2.select和epoll模型的不同。
3.动态内存分配算法,评价标准。
4.string的数据结构,vector为什么2倍扩张内存。
5.mysql有哪些存储引擎?
6.如何防止内存泄漏?
7.怎样检测内存泄漏?
8.linux下如何调试?

在编译文件时,带上'-g'参数(不过不带,则调试时看不到函数名,变量名,所代替的全是运行时的内存地址。)。

然后gdb test来启动GDB

l命令相当于list,从第一行开始列出源码,一般只显示10行,按回车接着显示后面的10行。依次下去。

break 16表示将断点设置在第16行。

break func表示将断点设置在函数func的入口地址。

info break表示查看断点信息(断点编号,类型,地址等)

r表示运行程序到断点处停止。

n表示单条语句执行,next的缩写。

c表示继续运行程序,continue的缩写。

p i表示打印变量的值,print的缩写。

bt表示查看函数的堆栈。

finish表示退出函数。

q表示退出gdb。
9.linux下awk命令


10.画出进程的内存区
11.说说封装、继承、多态
12.进程的状态转换图,有没有进程不在这三种状态的情况

僵尸进程不在这三种状态中。
13.http头部,还有关于stcp的啥忘记了,http和https的区别。

http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
14.僵尸进程,守护进程,孤儿进程

1)僵尸进程:一个进程结束了,但是他的父进程没有等待他(wait/waitpid),那么它将变成一个僵尸进程。

      危害:如果有大量的僵尸进程,会导致没有可用的进程号系统不能创建新的进程。

      避免方法:父进程通过wait/waitpid等函数等待子进程结束,但这会使父进程被挂起。

                          通过两次fork,父进程fork子进程,然后继续工作,子进程fork一个孙进程后退出,这样孙进程被init接管,孙进程结束后,会被回收。

2)守护进程:是一个生命期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

3)孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号1)收养。
15.指针和引用的区别
16.const的作用,const的实现机制(怎样做到只读?)。

int main()  
{  
    const int con_var1 = 3;  
    int * b = (int *)&con_var1;  
  
    *b  = 5;  
    std::cout <<con_var1 << " "<<*b ;  
    return 0;  
} 
输出:3 5

对代码中直接引用到该常量的情况,编译器会将其替换成定义时赋的值。这样无论运行期该常量所在的内存被如何修改,都不会影响到常量的使用。对于取地址操作&con_var,没有被替换成常量。

17.结构体字节对齐,sizeof
18.关于nosql
总结:没问算法,让我很是不解。C/C++部分回答的不错,操作系统,网络基础回答的一般般,数据库、http以及linux都回答的非常烂。
还是准备不充分,笔试过后,就没怎么复习,知道收到面试通知来开始复习,时间根本不够。
所以机会是留给有准备的人,还有几场笔试结果没出来,加油,提前准备,你不会亏!



四、CVTE秋招面试经历:
1.什么函数必须是重写的函数,什么函数是不能重写的函数。

2.查找一个文件用什么指令,查找文件内容用什么指令。

3.单例模式,不加锁如何实现线程安全。

4.ubuntu下怎样设置某一个程序开机启动

5./dec和/proc文件夹作用,里面有什么文件

6.makefile加-lm有什么作用,-l和-L的区别

7.查找带cvte关键字的cpp文件

8.进程间通信的方式

9.管道怎样实现进程间通信

10.在哪些情况下会调用拷贝构造函数

1)一个对象以值传递的方式传入函数体

2)一个对象以值传递的方式从函数返回

3)一个对象需要通过另一个对象初始化

显示:T a(b);

隐式:T a = b;

11.linux内核由哪几个部分组成,各自的作用。

1)进程调度:控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。

2)内存管理:允许多个进程安全的共享注内存区域。

3)虚拟文件系统:隐藏各种硬件的具体细节,为所有的设备提供统一接口。
4)网络接口:提供了对各种网络标识的存取和各种网络硬件的支持。

5)进程间通信:支持进程间各种通信机制。



五、招银网络科技(电话面试)

1.如何让C++程序跳到指定的地址执行?

查了一下,好像是缓冲区溢出攻击方面的内容。具体表现为利用缓冲区溢出部分的数据覆盖堆栈,用特定的地址替换堆栈中的返回地址,这样当函数调用返回的时候就会把我们替换的返回地址弹出到当前基址,继续执行就会转入我们想要跳转的地址执行事先设定好的代码段了。

#include <stdio.h>
int i = 0;
void attack()
{
	printf("hello, this's attack function\n");
}

void get()
{
	int a = 0;
	unsigned char ch[3];
	int *ret = 0;
	printf("%x\n%x\n", &a, &ch);
	//while((ch[i++] = getchar()) != '\n');
		//while(scanf("%d", ch[i++]));
	while (i < 23)
		ch[i++] = 0x90;
	ch[i++] = (char)(int)&attack % 256;            //用函数attack的入口地址来覆盖get的返回地址的栈位置的值,
	ch[i++] = (char)((int)&attack >> 8) % 256;     //即把返回地址改为指向attack函数的入口地址
	ch[i++] = (char)((int)&attack >> 16) % 256;
	ch[i++] = (char)((int)&attack >> 24) % 256;
	printf("i = %d %d %s\n", i, a, ch);
	//ret = &i + 5;
	//*ret -= 12;
	//return 0;
}

int main()
{
	//int i = 0;
	get();
	printf("hello\n");
	printf("%d\n", i);
	return 0;
}
参考:http://blog.163.com/jw_chen_cs/blog/static/20221214820124119642246/

2.C++程序如何修改给定地址对应的值?

3.单例模式的应用实例。

任务管理器、回收站、网站计数器、线程池等。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值