1.二进制中的与、或、非、异或运算
与运算
【与】运算符号为 & ,运算法则为遇0得0。也就是说只要有0,结果即为0。
举例:1001 & 1100
1 0 0 1
&
1 1 0 0
————
1 0 0 0
或运算
【或】运算符号为 | ,就是一个竖线,运算法则为遇1得1。也就是说,只要有1,结果就为1。
举例:1100 | 1010
1 1 0 0
|
1 0 1 0
————
1 1 1 0
非运算
【非】预算符号为 ~,就是一个波浪线,运算法则为按位取反,也就是遇1取0,遇0取1,即 ~1 = 0 , ~0 = 1;
举例:1001 & 1001
1 0 1 1
~
————
0 1 0 0
异或运算
【异或】运算符号为 ^,就是一个乘方符号,运算法则为相同取0,不同取1。异或运算,关键在异上面,异为1,否则为0。
举例:1001 & 1001
1 0 1 1
2.链表问题
使用双指针解决。例如:获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环
1.倒数第k个元素的问题
设有两个指针 p 和 q,初始时均指向头结点。首先,先让 p 沿着 next 移动 k 次。此时,p 指向第 k+1个结点,q 指向头节点,两个指针的距离为 k 。然后,同时移动 p 和 q,直到 p 指向空,此时 q 即指向倒数第 k 个结点。
2.获取中间位置的元素
设有两个指针 fast 和 slow,初始时指向头节点。每次移动时,fast向后走两次,slow向后走一次,直到 fast 无法向后走两次。这使得在每轮移动之后。fast 和 slow 的距离就会增加一。设链表有 n 个元素,那么最多移动 n/2 轮。当 n 为奇数时,slow 恰好指向中间结点,当 n 为 偶数时,slow 恰好指向中间两个结点的靠前一个。
3.判断链表是否存在环
与问题2的解决方法一致,使用快慢指针,当slow==fast时,成环,fast==nullptr || fast->next==nullptr,不成环。