4.零碎知识集合
数学问题
一、移位
1、什么样的数据类型可以直接移位
char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以进行移位操作,而double、float、bool、long double则不可以进行移位操作。
2、有符号数据类型的移位操作
对于char、short、int、long这些有符号的数据类型:
对负数进行左移:符号位始终为1,其他位左移 对正数进行左移:所有位左移,即 <<,可能会变成负数 对负数进行右移:取绝对值,然后右移,再取相反数 对正数进行右移:所有位右移,即 >>
3、无符号数据类型的移位操作
对于unsigned char、unsigned short、unsigned int、unsigned long这些无符号数据类型:
没有特殊要说明的,使用<< 和 >> 操作符就OK了
4、((unsigned int)(-1) >> 1)=2147483647对应32位的有符号的最大数;((unsigned int)(-1>>1))=4294967295对应32位的无符号的最大数。
函数
1、sort()定义的比较函数:对于排序后的每两个相邻元素都要满足使cmp结果为TRUE。也就是说,在进行比较运算的时候拿用户定义的比较函数来替代原有的比较运算符。
eg:
int cmp(int a,int b) return a>b;//从小到大排序
图
1、欧拉路径
欧拉路径问题,需要判定图是否是连通图,然后再判定是否存在欧拉路径。判定是否是连通图,可以使用并查集来实现。判定是否存在欧拉路径的条件是:无向图的所有结点的出入度均为偶数,或者有2个出入度为奇数的结点。满足这个条件的图,必然能够找到欧拉路径。由于是从结点1出发,如果有2个出入度为奇数的结点,1的出入度必须为奇数。(如果要求最小的字典序欧拉路径,则需要用set容器来存储,如set<int> g[N])