面试中常见的琐碎知识点(三)

1.结构体/类位域

   在结构体或类中,可以根据需要设置整型成员变量的位域(short int long unsigned short 

unsigned int unsigned long)就是表示类型不是采用浮点数那套表示的都可以

语法:

struct A

{

   int a:2;//设置a的位域宽2bits,那么表示的范围就只能是[-2,1],多了的自动截断

}

  但是,sizeo(A)==4(注意是4字节),因为会有自动补齐。

2. 231 是一个x进制的数,则一定能表示成:231 = 2*x^2 + 3*x + 1*x^0

3.平衡二叉树是每一个节点的左右子树的高度之差≤1.如果一颗树是平衡二叉树,那么这棵树的最高树高和最低树高之差≤1

评论:判断一颗二叉树是否平衡的好方法。

4.C++C语言上的改进(转自陈皓博客)

· namespace解决了很C函数重名的问题。

· const/inline/template代替了宏,解决了C语言中宏的各种坑。

· const的类型解决了很多C语言中变量值莫名改变的问题。

· 用引用代替指针,解决了C语言中指针的各种坑。这个在Java里得到彻底地体现。

· 用强类型检查和四种转型,解决了C语言中乱转型的各种坑。

· 用封装(构造,析构,拷贝构造,赋值重载)解决了C语言中各种复制一个结构体(struct)或是一个数据结构(link, hashtable, list, array等)中浅拷贝的内存问题的各种坑。

· 用封装让你可以在成员变量加入getter/setter,而不会像C一样只有文件级的封装。

· 用函数重载、函数默认参数,解决了C中扩展一个函数搞出来像func2()之类的ugly的东西。

· 用继承多态和RTTI解决了C中乱转struct指针和使用函数指针的诸多让代码ugly的问题。

· RAII,智能指针的方式,解决了C语言中因为出现需要释放资源的那些非常ugly的代码的问题。

· OOGP解决各种C语言中用函数指针,对指针乱转型,及一大砣if-else搞出来的ugly的泛型。

· STL解决了C语言中算法和数据结构的N多种坑

· 支持运算符重载和异常

5. hash_mapSTLmap的区别

   hash_map 是通过一个key然后利用hash函数映射求出地址下标的,取数据和数据插入时间复杂度都是O(1)(在hash冲突很少的情况下),但是空间会有一定的浪费。

   STL::map是利用红黑树(二叉平衡树)来存储数据的,因此数据的插入和查找需要O(logn),但是空间利用率高且不存在hash冲突。在处理以下问题的时候STL::map会比较有优势:

1)求最大值或最小值 Ologn

2)按序输出所有元素(中序遍历)

3)找出某个元素,当该元素不存在时找出小于该值的最大数。

   hash_map的优势:

1)频繁地查找或插入数据

2)可能会频繁地删除数据(平衡二叉树的删除需要调整二叉树,hash_map的删除不能直接delete掉该内存空间,而是设置一个标记位来标记该元素已被删除)

6.死锁的条件

   互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

   请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

   非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

   循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待   相邻进程正占用的资源。

7.假设A是一个类,则声明A *a[3] 和 A (*a)[3]会调用构造函数吗?

  解析:A *a[3] 声明的是一个指针数组,数组中有三个A *类型的元素,只有指针的声明,不存在对象的实例化。

  *a[3]声明的是数组指针,a指针的类型是指向的是一个有三个A对象元素的数组,但是也不存在对象实例化,没有调用构造函数。

运算符优先级:

8.一个具有n个顶点K条边的无向图是一个深林(n>k),则该深林有n-k颗树。

9.一个类的静态函数不能调用非静态函数(对象未构造时,非静态函数的入口地址未确定),但是非静态函数可以调用静态函数。

10.scanf函数的输入格式:

  scanf(“%d %f”,&i,&j); 100 763.1

  scanf(“i=%d ,f=%f”,&i,&j); i=100,f=763.1

也就是说,scanf函数中format的格式是什么样子的,该函数就按什么样式解析输入的串,因此输入格式就要和format的格式一样。


你可能感兴趣的:(数据结构,c,面试,操作系统)