1.进程与线程的区别(常问)
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一一个独立单位。例如,用户运行自己的程序,系统就创建一个进程 ,并为它分配资源,包括各种表格、内存空间、磁盘空间、I0设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来。
线程是进程的一一个实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只拥有-些在运行中必不可少的资源(如程序计数器、一组寄存器和栈 ) , 但是,它可以与同属一-个进程的其他的线程共享进程所拥有的全部资源。
在没有实现线程的操作系统中,进程既是资源分配的基本单位,又是调度的基本单位,它是系统中并发执行的单元。而在实现了线程的操作系统中,进程是资源分配的基本单位而线程是调度的基本单位,是系统中并发执行的单元。
进程间通信方式有那些。管道, FIFO ,信号,信号量,消息队列,共享内存(最快) , 套接字。
当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
画图是作为介绍项目的一种方式学会多去画图去介绍自己的项目流程。
调试
设置断点,单步跟踪,查看内存,分析调用栈,就可以很快发现问题,调试能力在书本上是学不到的,只有通过大量的软件开发实践才能积累出调试技巧。
简历中描述项目的STAR模型
situation:简短的项目背景
task:自己完成的任务
action:为完成任务自己做了哪些工作,是怎么做的
result:自己的贡献
在面试中遇到难题,我们有三种办法分析,解决复杂问题:画图能使抽象问题形象化,举例使抽象问题具体化,分解使复杂问题简单化。
面试时不要在技术面试时跟面试官谈薪水,不要立即打听面试结果,推荐问的问题是与应聘职位或者项目相关问题。
定义一个空的类型 里面没有任何成员变量和成员函数。对该类型求sizeof,得到的结果是多少?
答案是1
当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。
添加构造函数和析构函数,再对该类型求sizeof得到的结果是多少?
答还是1
调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关,而与类型的实例无关,编译器也不会因为这个两个函数在实例内添加额外信息。
如果把析构函数标记为虚函数时?
当发现类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4字节的空间,因此求sizeof得到4;如果是64位的机器,则是一个指针占8字节的空间,因此求sizeof得到8。
不允许复制构造函数传递参数,会导致栈溢出
例class A
A(A other)
解决方法把构造函数改为A(const A& other)把传递参数改成常量引用
c++中可以用struct和class来定义类型。这两种有什么区别?
没有标明成员函数或成员变量的访问权限级别,那么在struct中默认是public,而class默认private。
c++中析构函数的调用时机是不确定的,它的调用时机是由运行时决定的,因此对程序员来说是不确定的。
数据结构 大多少面试题围绕着数组,字符串,链表,树,栈及队列几种常见的展开,要熟悉掌握这几种数据结构。(尤其链表和树)栈和递归密切相关,队列与广度优先遍历算法紧密相关。
数组的空间效率不是很好,经常有空闲区域,时间效率很高因为内存连续。
当几个指针赋值给相同的常量字符串时,他们会指向相同的内存地址。但用常量内存初始化数组,是指向不同的地址。
在合并两个数组时,如果从前往后复制每个数字需要重复移动数字多次,那么我们可以考虑从后往前复制,这样可以减少移动次数,从而提高效率。
当我们往一个空链表里插入一个节点时,新插入的节点就是链表的头指针。由于此时会改动头指针,因此必须把phead参数设为指向指针的指针,否则出了这个函数phead依然是一个空指针。
红黑树:是把树中的节点定义为红,黑两种颜色,并通过规则确保从根节点到也节点的最长路径的长度不超过最短路径的两倍。
考察算法 递归 循环。
考察排序和查找 二分查找 顺序查找 哈希表查找 二叉树查找 归并排序 快速排序。
二维数组搜索路径 回溯法 用栈模拟递归。
某个问题的最优解可以划分为多个子问题时可以考虑动态规划。
学习了解动态规划和贪婪算法
二分查找代码要熟悉
递归是在一个函数的内部调用这个函数自身。
循环是通过设置计算的初始值及终止条件,在一个范围内重复运算。
每次访问指针地址之前都要考虑这个指针有没有可能是null
栈的压入,弹出序列
总结:我们可以找到判断一个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;如果下一个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止;如果所有数字都压入栈后依然没有找到下一个弹出的数字,那么该序列不可能是下一个弹出序列。
如果面试中面试题要求处理一颗二叉树的遍历序列,则可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归地处理这两个子序列。
手撕代码
一、明确代码目标
二、分析代码内部逻辑,选择API(程序接口)
三、编写代码
C语言中数字下标可以是负号,在代码运行前不会对数组是否下标越界、溢出等异常进行警告或处理,而C#,JAVA等语言会将下标为负等当做是异常处理来看待,所以不建议下标为负的写法。
11.19笔记总结
最新推荐文章于 2024-12-23 15:35:36 发布