1、位移运算
所有的位移运算都是基于二进制数据的移动,所以最起码需要明白十进制和二进制之间的转换。以12345这个十进制数为例,那么对应的二进制整型就是00000000000000000011000000111001,位移的运算就是基于00000000000000000011000000111001这些数据进行的移动。
<<
12345转为二进制其实就是11000000111001,但整型占32位,高位用0表示,所以整体表示就是00000000000000000011000000111001。左移一位就是将11000000111001往左移一位,右边补0
位移后十进制数值变成:24690,刚好是12345的二倍,所以有些人会用左位移运算符代替乘2的操作,但是这并不代表是真的就是乘以2,很多时候,我们可以这样使用,但是一定要知道,位移运算符很多时候可以代替乘2操作,但是这个并不代表两者是一样的!
>>
右移后得到的值为 6172 和int 类型的数据12345除以2取整所得的值一样,所以有些时候也会被用来替代除2操作。但是如果继续右移,直接右移14位,即为e>>14,则结果为0。
>>>
无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的。在右移运算符中,右移后补0,是由于正数 12345 符号位为0 ,如果为1 则应补1。
2、简单排序
选择排序
冒泡排序
插入排序
归并排序-递归实现
归并排序-非递归实现
快速排序
3、简单算法题
假设有一个函数可以等概率返回[1,5]的整数。请利用这个函数写出等概率返回[1,7]之间的整数:
假设有一个函数,以p概率返回0,1-p概率返回1。请利用这个函数写出等概率返回0和1:
4、对数器
有了对数器以后,不需要依赖任何别的工具,对数器就可以生成随机样本自己来做比对。当样本数据足够大的时候,错误的例子也会足够的多,对数器可以将错误打印出来,自己就可以一点一点去追溯错误的源头。
5、二分法
使用二分法在有序数组中找到num
使用二分法在有序数组中找到 >= num 最左的位置
局部最小值问题
6、时间复杂度
先来介绍一个概念常数操作:
如果某一次的操作和数据量没有关系,那它就是固定时间的,这种操作就是常数操作。比如:
① 整型数据的+、-、×、÷都是典型的常数操作符号;
② 数据寻址,取出数组中的第1个数据和第100万个数据时间上没啥区别;
时间复杂度是用来描述进行了多少次常数操作的指标。
7、链表问题
实现单链表和双链表的逆序操作
使用单链表实现队列
使用单链表实现栈
使用双向链表实现双向队列
给定一个单链表的头节点head,和一个正数k。实现k个节点的小组内部逆序,如果最后一组不够k个就不调整。比如:
调整前:1 > 2 > 3 > 4 > 5 > 6 > 7 > 8,k=3
调整后:3 > 2 > 1 > 6 > 5 > 4 > 7 > 8
给定两个链表的头节点head1和head2,认为从左到右是某个数字从低位到高位,实现返回相加之后的链表。比如:
给定:4 > 3 > 6、2 > 5 > 3
返回:6 > 8 > 9(436 + 253 = 986)
给定两个有序链表的头节点head1和head2,返回合并后的大链表,要求依然有序。比如:
给定:1 > 3 > 3 > 5 > 7、2 > 2 > 3 > 3 > 7
返回:1 > 2 > 2 > 3 > 3 > 3 > 3 > 5 > 7
8、位图的实现
9、位运算实现+、-、×、÷
先来普及一个常识:异或运算(^)就是无进位相加,就是1 + 1的结果是0,忽略掉进位1。
比如:0 1 1 0 1 1 0
加上:1 1 1 0 1 1 1
结果:1 0 0 0 0 0 1
而有进位相加产生的【进位】就是 & 运算之后 <<1 的结果。
比如:0 1 0 1 1 1 0
&上: 0 0 1 0 1 0 0
结果:0 0 0 0 1 0 0
<<1: 0 0 0 1 0 0 0 –> 这就是相加的进位
10、二叉树
判断两棵树结构是否相同
判断一棵树是否是镜面树
给定一个二叉树,找出其最大深度
从前序与中序遍历序列构造二叉树
给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
判断一棵树是不是平衡二叉树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111926.html