算法
位运算
32位int的二进制格式:
int=1
则1的二进制为:00000000000000000000000000000001
int的最大值为231-1=2147483647:01111111111111111111111111111111
int的最小值为-231+1=-2147483648=10000000000000000000000000000000
复数计算要先取反
>> 带符号右移,左边补符号位
>>> 不带符号右移,左边补0
N取反加1=N的相反数,但int 最小值取反+1还是它自己,如:
int a=3;
b=~a;
//输出b=-3
a=Integer.MIN_VALUE;
//取反是它自己
//0取反还是0
算法
针对一个问题,设计一个流程,就叫算法。
算法的分类
- 明确知道流程 或 不知道什么流程但知道怎么试(图灵机)
简单排序算法
选择排序
每次从列表中选择一个最小的值放在结果集中。
如下图:先判断边界条件,以减少程序运行代码量。
冒泡排序
从头到尾依次同后一位数比较,大的往后排。
插入排序
把左侧的从第一位开始,看成一个有序数组,每一个后面的数字看成新来的,从大到小和有序数组中的数字依次比较,最终得到一个有序数组。
插入排序优化:
一個考題,看你會不會?
- 題目1:已知我有一個函數,可以得到1~5的随机数,你在不适用任何其它函数的情况下使用这个已知函数来得到1 ~ 7的随机数么?
- 题目2:类似题1。
- 题目3:已知函数f(),返回0和1的不等概率值,如何使用f()得到01的等概率值?
答案1:只是提示:先获得01的等概率数,然后根据二进制得到0~6的等概率值+1
答案3:
数据结构
任何数据结构都是连续结构和跳转结构的组合
是存储、组织数据的方式
举例:从一个数组中查询某个范围内的数字和。
-
方案一:一次生成所有的结果组合,每次直接取值
-
方案2:生成一个一维数组,每次相减得到需要的值
待更新