面试总结(一)

深信服一面(已挂)
1、在一个字符串中查找指定字符的方法有哪些?
答:遍历字符串,逐个判断;用strchr()函数查找,返回第一次出现的字符的地址;用一个辅助数组来做hash映射,第一次扫描时,更新在辅助数组中当前字符出现的次数,hash查找的时间复杂度为O(1),第二次扫描时,在辅助数组中找出当前字符出现一次的位置;

2、如果要在字符串中查找{a,b,c}中的任意一个字符并返回第一次出现的下标,怎么做?
答:

3、在一个无序字符串中如何统计字符为数字的个数,并记录数字0-9分别出现的次数?
答:用ASCII码进行判定,i>='0’或i<=‘9’,记录次数可以用一个大小为10的数组,令arr[ch-‘0’]++;

4、进程和线程了解吗?区别是什么?fork()函数?生产者消费者模式?
答:1)进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位。但是并不是说CPU不在以进程为单位进行调度,虽然在某些操作系统中是这样。同一个进程中并行运行多个线程,就是对在同一台计算机上运行多个进程的模拟。
2)进程有独立的地址空间,而同一进程中的线程共享该进程的地址空间。比如在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种非常昂贵的多任务工作方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,因此启动一个线程,切换一个线程远比进程操作要快,花费也要小得多。当然,线程是拥有自己的寄存器和堆栈(线程栈),比如在windows中用_beginthreadex创建一个新进程就会在调用CreateThread的同时申请一个专属于线程的数据块(_tiddata)。虽然,线程有自己线程栈,线程可以直接访问全局变量,甚至可以访问进程地址空间中的每一个内存,所以一个线程可以读写甚至清楚另一个线程的堆栈。
3)线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量,打开的文件,子进程),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。在一个线程中分配的堆在各个线程中均可以使用,在一个线程中打开的文件各个线程均可用,当然指同一进程中的线程。
4)多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影响。
5)线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中,由应用程序提供多个线程的并发控制。
6)linux中进程具有父子关系,形成进程树,但是线程是平等的没有父子关系

fork()可以创建进程或线程

5、写一段代码打开一个文件并写入指定内容

  FILE* fpout;
  fpout = fopen("file2.txt", "w");   //第二个参数“w”代表只准写入
  for (int i = 0; i < n; ++i) {
    fprintf(fpout, "%d\n", i * i);  //此函数把数据写入文本
  }
  fclose(fpout);

6、动态库了解吗?
答:静态库是编写的时候加载进源代码进行编译的,如各种头文件。动态库是在程序运行的时候映射进程序的内存空间进行动态加载的,如DLL文件。

7、TCP三次握手发送什么内容?
答:答:三次握手:
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

8、栈和队列的区别,队列的特点是什么,怎么用栈实现队列的功能?
答:栈与队列的相同点:
1.都是线性结构。
2.插入操作都是限定在表尾进行。
3.都可以通过顺序结构和链式结构实现。、
4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。
5.多链栈和多链队列的管理模式可以相同。

栈与队列的不同点:
1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。
3.顺序栈能够实现多栈空间共享,而顺序队列不能。

队列的特点是只允许在一端插入,在另一端删除;

使用STL中的stack创建两个栈,s1和s2,s1负责入栈,s2负责出栈;
队列入队:使用STL中的stack会动态分配内存,因此不必担心栈满的情况,所以入队时,直接将元素入s1栈即可。
队列出队:出队时需要s2出栈,因此要判定s2是否为空;若s2为空,则将s1中元素一一出栈进入s2栈中,此时s2已不为空;那么队列出队只需将s2出栈即可。当然,如果s1和s2均为空,则出队失败。

9、用C语言写一个最简单的helloworld程序,C语言和C++的区别是什么

#include<stdio.h>

int main()
{
    printf("hello,world\n");
    return 0;
}

C和C++的区别:
1)C面向过程,C++面向对象;

10、写出一个数据库查询语句,只输出符合某个条件的第一条数据或最后一条数据?
答:Select top 1 from table1 where a=0

11、二叉树的先序遍历怎么遍历?先序、中序、后序的区别是什么?
答:先序:根左右;中序:左根右;后序:左右根;

12、对socket了解多少?

13、windos开发怎么调试程序

14、头文件的“”和<>有什么区别?
答:#include< >常用来包含系统提供的头文件,编译器回到保存系统标准头文件的位置查找头文件;而#include" "常用于包括程序员自己编号的头文件,用这种格式时,编译器先查找当前目录是否有指定名称的头文件,然后从标准头目录中进行查找。

15、说一下排序算法的原理,六大排序算法都说
答:冒泡排序:
比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

选择排序:初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

(直接)插入排序:对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。

希尔排序:利用(直接)插入排序的对基本有序的数据进行排序的很高的效率的特点,先将待排序列分成若干子序列,对每个子序列进行(直接)插入排序,最后当整个序列基本有序时,再对整体进行一次(直接)插入排序。需要强调的是,希尔排序对子序列的划分不是以数据段划分的,而是以“某一增量”为间隔来取子序列,当增量为0时代表此时的整体序列为基本有序序列。

归并排序:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针到达序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

快速排序:
从序列中挑出一个元素,作为”基准”(pivot).
把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。
对每个分区递归地进行步骤1~2,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。

16、单向链表中删除一个结点怎么操作?
答:比如要删除的结点时p的后继结点,则只需p->next=p->next->next;

17、哈希函数了解吗?

18、锁了解吗?互斥锁?

19、find函数的具体实现?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值