算法1000问(第一弹)

201 阅读2分钟

算法1000问:(第一弹)

  1. 牛客平台使用:在使用java语言时因注意的细节

    • 应当导入库

       import java.util.*;
      
    • 应当有主类并包含main 方法,且主类命名为Main

      当需要抛出异常时,应该再方法声明末尾处后接throws关键字

       public class Main{
           public static void main (String[] args ) throws Exception{
           }
       }
       ​
      
  2. java中处理字符串拼接的类

    • 使用StringBuilder进行处理

      • 将字串拼接在末尾:s.append("3");
      • 将字符串反转并赋值:String s = bur.reverse();
  3. 如何遍历一颗二叉树:

    • 遍历方法:

      • 前(先)序遍历:根左右
      • 中序遍历:左根右
      • 后续遍历:左右根
    • 参考链接:juejin.cn/post/691862…

  4. 算法中while的条件:

    • 场景一:当整数n不为零时,执行循环条件

      • 不能这样写:

         while(n)
        
      • 要这样写:

         while(n != 0)
        
  5. 评估算法优劣的核心指标:

    • 时间复杂度:由流程决定
    • 额外空间复杂度:流程决定
    • 常数项时间:细节决定
  6. 常数时间操作:不以数据量为转移

    • 每次执行均为固定时间

    • 常见常数项时间的操作:

      • 常见的算术运算:+ - * / %
      • 常见位运算:>>,>>>,<<,|,&,^
      • 赋值、比较、自增、自减
      • 数组寻址:寻找偏移量
  7. 非常数时间操作:每次执行时间不固定

    • LinkedList中取出指定节点的值:get(i)
    • LinkedList底层是双向链表,在执行get(i)时,需要进行遍历;并且i的不同,导致每次执行的时间不同
  8. 带符号位右移(>>)与不带符号位右移(>>>)区别?

    • 带符号位右移(>>):原数二进制表示右移一位后,原最高位由原符号位(原最高位)填充

      • Q不带符号位右移(>>>):原数二进制表示右移一位后,原最高位由0(原最高位)填充
  9. 选择排序时间复杂度估计:o(N)平方

    • 设总样本为N个;设每次排序时原数组中未排序项的个数为Y,则排序依次Y--;每次更新时会进行Y次操作(比较Y-1次,并且会将最小/大的数与本次排序的首位交换)
    • 所以就是o(N)平方
  10. 如何确定算法总操作量与样本数量之间的关系

    1. 以最坏情况执行算法流程

    2. 将每阶段流程拆分为基本操作(也就是常数时间的操作,此操作不随样本数量改变而改变)

    3. 将样本量设为N,则时间复杂度为总操作量多项式中的最高阶1`

      • 时间复杂度仅与数据量有关,与过程优化无关·