算法1000问:(第一弹)
-
牛客平台使用:在使用java语言时因注意的细节
-
应当导入库
import java.util.*; -
应当有主类并包含main 方法,且主类命名为Main
当需要抛出异常时,应该再方法声明末尾处后接throws关键字
public class Main{ public static void main (String[] args ) throws Exception{ } }
-
-
java中处理字符串拼接的类
-
使用StringBuilder进行处理
- 将字串拼接在末尾:s.append("3");
- 将字符串反转并赋值:String s = bur.reverse();
-
-
如何遍历一颗二叉树:
-
遍历方法:
- 前(先)序遍历:根左右
- 中序遍历:左根右
- 后续遍历:左右根
-
-
算法中while的条件:
-
场景一:当整数n不为零时,执行循环条件
-
不能这样写:
while(n) -
要这样写:
while(n != 0)
-
-
-
评估算法优劣的核心指标:
- 时间复杂度:由流程决定
- 额外空间复杂度:流程决定
- 常数项时间:细节决定
-
常数时间操作:不以数据量为转移
-
每次执行均为固定时间
-
常见常数项时间的操作:
- 常见的算术运算:+ - * / %
- 常见位运算:>>,>>>,<<,|,&,^
- 赋值、比较、自增、自减
- 数组寻址:寻找偏移量
-
-
非常数时间操作:每次执行时间不固定
- LinkedList中取出指定节点的值:get(i)
- LinkedList底层是双向链表,在执行get(i)时,需要进行遍历;并且i的不同,导致每次执行的时间不同
-
带符号位右移(>>)与不带符号位右移(>>>)区别?
-
带符号位右移(>>):原数二进制表示右移一位后,原最高位由原符号位(原最高位)填充
- Q不带符号位右移(>>>):原数二进制表示右移一位后,原最高位由0(原最高位)填充
-
-
选择排序时间复杂度估计:o(N)平方
- 设总样本为N个;设每次排序时原数组中未排序项的个数为Y,则排序依次Y--;每次更新时会进行Y次操作(比较Y-1次,并且会将最小/大的数与本次排序的首位交换)
- 所以就是o(N)平方
-
如何确定算法总操作量与样本数量之间的关系
-
以最坏情况执行算法流程
-
将每阶段流程拆分为基本操作(也就是常数时间的操作,此操作不随样本数量改变而改变)
-
将样本量设为N,则时间复杂度为总操作量多项式中的最高阶1`
- 时间复杂度仅与数据量有关,与过程优化无关·
-