一些要点
注意:手写或者机试可能没有代码提示,所以一些基本函数名要记得
-
整形,字符串互转
//int -> string Integer.toString(x) //String -> int Integer.valueOf(s) -
字符的反转函数
/* * toString() 不能忘记,因为不用就是StringBuilder * String类没有reverse()方法 * StringBuilder线程不安全;StringBuffer线程安全 */ new StringBuilder(s).reverse().toString() -
字符串转字符数组函数
s.toCharArray() s.charAt(i) -
字符串、数组和链表的大小
//字符串的()不能少 s.length(); arr.length; list.size(); -
栈的使用
适合栈的问题:括号问题,路径问题,后进先出的问题;
//先进后出栈 Stack<Integer> stack = new Stack<>(); stack.pop();//弹出 stack.push(object);//压入 stack.empty();//栈是否空 stack.peek();//查看栈顶的元素,不移除链表实现栈
-
KMP解法
k m p 3个人名首字母 KMP 算法是一个快速查找匹配串的算法 没懂
-
动态规划
基本的解法要知道 一个数组的最大子数组和;
-
Math常用函数
Math.max(a, b) // 比大小,返回最大的 Math.abs(a) // 绝对值 Math.pow(doublea, doubleb) // a^b -
0-9字符 转整形
char c = '9'; int i = c - '0'; int i2 = Intger.parseInt(Character.toString(c)); -
数组最大子序和
思路:动态规划,
-
二叉树
求最大深度
public int maxDept(TreeNode root){ if(root == null){ return 0; } return 1 + Math.max(maxDept(root.left), maxDept(root.right)); }前中后序遍历 是基础, 简单记住
// 前序遍历 public void recursionA(TreeNode root){ if(root == null){ return; } System.out.println(root.val); if(root.left != null){ recursion(root.left); } if(root.right != null){ recursion(root.right); } } // 中序遍历 public void recursionB(TreeNode root){ if(root == null){ return; } if(root.left != null){ recursion(root.left); } System.out.println(root.val); if(root.right != null){ recursion(root.right); } } // 后序遍历 public void recursionC(TreeNode root){ if(root == null){ return; } if(root.left != null){ recursion(root.left); } if(root.right != null){ recursion(root.right); } System.out.println(root.val); } -
字符的ascII码
“A”为65;“a”为97;“0”为 48
代码里不使用数字也可使用字符在判断,记不住对应的数字
字符 ascii 字符 ascii 字符 ascii 0 48 A 65 a 97 1 49 B 66 b 98 2 50 C 67 c 99 3 51 D 68 d 100 4 52 E 69 e 101 5 53 F 70 f 102 6 54 G 71 g 103 7 55 H 72 h 104 8 56 I 73 i 105 9 57 J 74 j 106 K 75 k 107 L 76 l 108 M 77 m 109 N 78 n 110 O 79 o 111 P 80 p 112 Q 81 q 113 R 82 r 114 S 83 s 115 T 84 t 116 U 85 u 117 V 86 v 118 W 87 w 119 X 88 x 120 Y 89 y 121 Z 90 z 122 -
判断回文一般都是用双指针算法
双指针
排序的数组,一个在前 一个在后,根据条件缩搜索减空间链表的回文 快慢指针找出中点,翻转后面一段与开头对比
-
位运算的性质
可判断不重复的那个数
判断2个数相同,用异或
异或,不同为1,相同为0
a ^ 0 = a
a ^ a = 0 -
判断数组链表是否有环
判断是否进入了循环中hash表法: 就是遍历数组链表,如果元素在hash表中 说明有环,否则加进表中
快慢指针法(龟兔算法):一快一慢,直到快的与慢的相遇,说明有环,空间o(1)
-
链表,树在代码中的形式【了解】
// 链表 ListNode{ // 保存的值 int val; // 下一指针地址 ListNode next; ListNode(){} ListNode(int val, ListNode node){ this.val = val; this.next = node; } } // =============^.^================== // 二叉树 TreeNode{ // 保存的值 int val; // 左子节点 TreeNode left; // 右子节点 TreeNode right; TreeNode(){} TreeNode(int val, TreeNode left, TreeNode right){ this.val = val; this.left = left; this.right = right; } } -
常见方法
-
暴力枚举 通常o(n^2)
-
hash表法 维持一个记录各个数的计数,最后选出最大的那个数 o(n)
-
摩尔投票法 对拼消耗 选出众数,一个数组中最多的那个元素
-
-
ans = ans * 26 + num
26进制, * 26 等于 进位1位
-
数据库sql
select distinct 去除相同的结果 left join 左连接 where 条件 group by 分组 order by 排序 having count() ifnull(dd, cc) 判断dd是否为null,是取后面cc的值 dateDiff(a.RecordDate, b.RecordDate) 得到2个日期的差on 和 where 的区别?
ON 条件是在生成临时表时使用的条件,它不管 ON 中的条件是否为真,都会返回左边表中的记录; WHERE 条件是在临时表已经生成后,对临时表进行的过滤条件。因为此时已经没有 LEFT JOIN 的含义(必须返回左侧表的记录)了,所以如果 WHERE 条件不为真的记录就会被过滤掉。
-
翻转链表
/** * 翻转链表,改变其箭头方向,将元素的下一结点指向前一个结点,前一个结点保存下来 * 时间 o(n) 空间(1) */ public ListNode reverseList(ListNode head){ ListNode cur = head; ListNode pre = null; while(cur != null){ // 下一个结点保存 ListNode next = cur.next; // 重置下一个节点为前一个结点 cur.next = pre; // 当前结点保存为前一个结点 pre = cur; // 循环到下一个结点 cur = next; } return pre; }
未完待续...