算法
按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)
当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。
给定一个二叉搜索树(BST),找到树中第 K 小的节点
在二叉查找树种:
(1)若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值。
(2)任意结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
(3)任意结点的左、右子树也分别为二叉查找树。
(4)没有键值相等的结点。
二叉树的遍历次序:
前序顺序是根节点排最先,然后同级先左后右;中序顺序是先左后根最后右;后序顺序是先左后右最后根。
树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }} class Solution { private class ResultType { boolean found; // 是否找到 int val; // 节点数目 ResultType(boolean found, int val) { this.found = found; this.val = val; } } public int kthSmallest(TreeNode root, int k) { return kthSmallestHelper(root, k).val; } private ResultType kthSmallestHelper(TreeNode root, int k) { if (root == null) { return new ResultType(false, 0); } ResultType left = kthSmallestHelper(root.left, k); // 左子树找到,直接返回 if (left.found) { return new ResultType(true, left.val); } // 左子树的节点数目 = K-1,结果为 root 的值 if (k - left.val == 1) { return new ResultType(true, root.val); } // 右子树寻找 ResultType right = kthSmallestHelper(root.right, k - left.val - 1); if (right.found) { return new ResultType(true, right.val); } // 没找到,返回节点总数 return new ResultType(false, left.val + 1 + right.val); } }
给定一个链表,删除链表的倒数第 N 个节点,并且返回链表的头结点
public class Num19 { public static void main(String[] args) { int[] arr = {3, 2, 5, 8, 4, 7, 6, 9}; ListNode head = new ListNode(arr); head = removeNthFromEnd(head, 8); System.out.println(head.toString()); } public static ListNode removeNthFromEnd(ListNode head, int n) { //当链表为空或者要删除的节点小于等于0的时候,直接返回head if (head == null || n <= 0) return head; //建立一个虚拟的表头结点,因为需要删除的节点有可能是头结点, // 所以建立虚拟头结点可以不用分是否是头结点两种情况 ListNode tempHead = new ListNode(0); tempHead.next = head; ListNode p = tempHead, q = tempHead; //p指针比q指针先跑n次 for (int i = 0; i < n; i++) { //如果p为空的时候,说明这个节点的长度不足n,返回head if (p == null ) return head; else { p = p.next; } } //p,q一起往前跑,直到p的next为空, // q所指向的下一个结点就是要删除的元素的位置 while (p.next != null) { p = p.next; q = q.next; } //删除q指向的节点的下一个元素 q.next = q.next.next; //删除虚拟头结点 return tempHead.next; } static class ListNode { int val; ListNode next; ListNode(int x) { val = x; } public ListNode(int[] arr) { if (arr == null || arr.length == 0) throw new IllegalArgumentException("arr can to be empty"); this.val = arr[0]; ListNode cur = this; for (int i = 1; i < arr.length; i++) { cur.next = new ListNode(arr[i]); cur = cur.next; } } @Override public String toString() { StringBuilder res = new StringBuilder(); ListNode cur = this; while (cur != null) { res.append(cur.val + "->"); cur = cur.next; } res.append("NULL"); return res.toString(); } } }
反转链表按k,最长重复子串
给定一个整数数组和一个整数,返回两个数组的索引,这两个索引指向的数字
的加和等于指定的整数。需要最优的算法,分析算法的空间和时间复杂度
public int[] twoSum(int[] nums, int target) { if(nums==null || nums.length<2) return new int[]{0,0}; HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i=0; i<nums.length; i++){ if(map.containsKey(nums[i])){ return new int[]{map.get(nums[i]), i}; }else{ map.put(target-nums[i], i); } } return new int[]{0,0};} 分析:空间复杂度和时间复杂度均为 O(n)
已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位。
public class Main { public static void main(String[] args) { double l = 1.41; double r = 1.42; double mid = (r+l)/2; double flag = 0.0000000001; while(r-l > flag){ mid = (r+l)/2; if(mid*mid < 2) l = mid; else r = mid; } System.out.println(mid); } }
如何实现一个高效的单向链表逆序输出?
直接递归(简单,但O(n)空间复杂度不支持大数据量)
// 直接递归实现核心代码片段 public void reverse(head){ // 递归终止条件 if(head.next == null){ print(head); return; } // 下一层需要做的事儿 reverse(head.next); // 本层需要做的事儿 print(head); }
JAVA算法:最长重复子串问题(JAVA解题)
package com.bean.algorithm.basic; public class LongestRepeatingSubstring { // Returns the longest repeating non-overlapping // substring in str static String longestRepeatedSubstring(String str) { int n = str.length(); int LCSRe[][] = new int[n + 1][n + 1]; String res = ""; // To store result int res_length = 0; // To store length of result // building table in bottom-up manner int i, index = 0; for (i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { // (j-i) > LCSRe[i-1][j-1] to remove // overlapping if (str.charAt(i - 1) == str.charAt(j - 1) && LCSRe[i - 1][j - 1] < (j - i)) { LCSRe[i][j] = LCSRe[i - 1][j - 1] + 1; // updating maximum length of the // substring and updating the finishing // index of the suffix if (LCSRe[i][j] > res_length) { res_length = LCSRe[i][j]; index = Math.max(i, index); } } else { LCSRe[i][j] = 0; } } } // If we have non-empty result, then insert all // characters from first character to last // character of String if (res_length > 0) { for (i = index - res_length + 1; i <= index; i++) { res += str.charAt(i - 1); } } return res; } // Driver program to test the above function public static void main(String[] args) { String str = "aabaabaaba"; System.out.println(longestRepeatedSubstring(str)); } }
给一个数组,找出出现次数大于数组长度一半的那个数。(我直接无脑用哈希表,面试官皱着眉头说能优化不,我想了半天没想出来)。
package test; public class Search { public static void main(String[] args) { //System.out.println("Hello World!"); Integer []a={4,5,5,2,3,5,2,5,5,5}; Integer len= a.length; Integer result = search(a,len); System.out.println(result); } public static Integer search(Integer A[],Integer len){ if(A==null || len<=0) { return -1; } Integer k=null, j=0; for(Integer i=0;i<len;++i) { if(j==0) { k=A[i]; } if(k==A[i]) { ++j; }else { --j; } } return k; } }
给一个链表1->2->3->4->5->6->7 和 一个数字n每n个反转一次链表。如 n = 2时,2->1->4->3->6->5->7;n = 3时,3->2->1>6->5->4->7
罗马数字转整数 leetcode13
class Solution { public int romanToInt(String s) { Map<Character,Integer> map = new HashMap<>(); map.put('I',1); map.put('V',5); map.put('X',10); map.put('L',50); map.put('C',100); map.put('D',500); map.put('M',1000); //用map结构来存储字母与带表的值 char[] temp = s.toCharArray();//将其转化为数组会索引时会更快 int length = temp.length;//现记录长度,避免循环的时候每次都要去计算 int sum = 0;//原来保存最后的值 for(int i=0;i<length-1;i++){//只循环到倒数第二个,因为最后一个肯定是被加上的数 int curTemp = map.get(temp[i]);//获取当前字母的值 int nextTemp = map.get(temp[i+1]);//获取相邻字母的值 sum += curTemp < nextTemp ? -curTemp : curTemp;//比较,如果当前值小于右边,就应该减,否则加 } return sum+ map.get(temp[length-1]);//之前循环的时候并没有循环最后一个,因为最后一个无论如何都是会被加上的,所以此时加上 } }
反转链表,删除排好序数组中重复元素
/** * 单链表相关操作 * * @author yinhr * */ public class LinkedListUtil { /** * 反转链表(3指针pre head headNext) * * @param head * @return */ ListNode reverse(ListNode head) { ListNode pre = null; ListNode headNext; while (head != null) { headNext = head.next; head.next = pre; pre = head; head = headNext; } return pre; } /** * 删除有序链表中重复值,重复值不保留(头结点+三指针pre head end) * * @param head * @return */ ListNode deleteRepeat(ListNode head) { // 创建头节点用于返回链表 ListNode headNode = new ListNode(0, head); ListNode pre = headNode; // 用于寻找第一个不同值节点 ListNode end; while (head != null && head.next != null) { // 当前值和它的下个值不等则移动两指针 if (head.value != head.next.value) { pre = head; head = head.next; } else { end = head.next.next; while (end != null && end.value == head.value) { end = end.next; } pre.next = end; head = end; } } return headNode.next; } /** * 删除有序链表中重复值,重复值保留一个(1)两指针listHead head,相邻两个相等删除后一个(2)三指针listHead head end * * @param head * @return */ ListNode deleteRepeatKeepOne(ListNode head) { // 用于返回链表 ListNode listHead = head; // (1)用于寻找第一个不同值节点 ListNode end; while (head != null && head.next != null) { // 当前值和它的下个值不等则移动指针 if (head.value != head.next.value) { head = head.next; } else { // (2)也可只用list.next = list.next.next; end = head.next.next; while (end != null && end.value == head.value) { end = end.next; } head.next = end; head = end; } } return listHead; } }
数据库
大数据
阿里巴巴
中等 | 2021-06-17 | 15 |
|
| |
容易 | 2021-08-04 | 13 |
|
| |
容易 | 2021-08-12 | 10 |
|
| |
中等 | 2021-08-05 | 10 |
|
| |
中等 | 2021-06-06 | 10 |
|
| |
中等 | 2021-04-16 | 9 |
|
| |
中等 | 2021-06-16 | 8 |
|
| |
容易 | 2021-04-09 | 8 |
|
| |
中等 | 2021-06-16 | 7 |
|
| |
容易 | 2021-07-25 | 5 |
|
| |
容易 | 2021-07-05 | 5 |
|
| |
困难 | 2021-06-28 | 5 |
|
| |
容易 | 2021-06-06 | 5 |
|
| |
中等 | 2021-05-10 | 5 |
|
| |
容易 | 2021-03-22 | 5 |
|
| |
容易 | 2021-08-02 | 4 |
|
| |
容易 | 2021-05-09 | 4 |
|
| |
容易 | 2021-05-08 | 4 |
|
| |
容易 | 2021-04-25 | 4 |
|
| |
中等 | 2021-04-15 | 4 |
|
| |
中等 | 2021-04-14 | 4 |
|
| |
容易 | 2021-04-09 | 4 |
|
| |
中等 | 2020-07-07 | 4 |
|
| |
容易 | 2021-07-05 | 3 |
|
| |
困难 | 2021-06-16 | 3 |
|
| |
中等 | 2021-06-09 | 3 |
|
| |
容易 | 2021-05-28 | 3 |
|
| |
中等 | 2021-05-25 | 3 |
|
| |
中等 | 2021-05-08 | 3 |
|
| |
容易 | 2021-04-12 | 3 |
|
| |
中等 | 2021-04-11 | 3 |
|
| |
中等 | 2021-04-09 | 3 |
|
| |
容易 | 2021-04-03 | 3 |
|
| |
中等 | 2021-03-09 | 3 |
|
| |
困难 | 2021-02-22 | 3 |
|
| |
容易 | 2020-12-14 | 3 |
|
| |
中等 | 2021-08-09 | 2 |
|
| |
中等 | 2021-08-07 | 2 |
|
| |
中等 | 2021-08-03 | 2 |
|
| |
中等 | 2021-07-26 |
|
|
| |
容易 | 2021-06-05 | 2 |
|
| |
容易 | 2021-05-24 | 2 |
|
| |
中等 | 2021-05-20 | 2 |
|
| |
中等 | 2021-04-16 | 2 |
|
| |
容易 | 2021-04-15 | 2 |
|
| |
容易 | 2021-04-15 | 2 |
|
| |
中等 | 2021-04-06 | 2 |
|
| |
容易 | 2021-04-02 | 2 |
|
| |
中等 | 2021-03-30 | 2 |
|
| |
中等 | 2021-03-29 | 2 |
|
| |
中等 | 2021-03-29 | 2 |
|
| |
中等 | 2021-03-22 | 2 |
|
| |
中等 | 2021-03-19 | 2 |
|
| |
困难 | 2021-03-18 | 2 |
|
| |
容易 | 2021-03-18 | 2 |
|
| |
容易 | 2021-03-11 | 2 |
|
| |
容易 | 2021-03-09 | 2 |
|
| |
困难 | 2021-03-07 | 2 |
|
| |
困难 | 2021-03-07 | 2 |
|
| |
中等 | 2021-03-06 |
|
|
| |
中等 | 2021-03-05 | 2 |
|
| |
容易 | 2021-02-27 | 2 |
|
| |
容易 | 2020-07-07 | 2 |
|
| |
容易 | 2020-07-07 | 2 |
|
| |
容易 | 2020-07-07 | 2 |
|
| |
中等 | 2021-08-10 | 1 |
|
| |
困难 | 2021-08-07 | 1 |
|
| |
中等 | 2021-08-03 | 1 |
|
| |
中等 | 2021-07-30 | 1 |
|
| |
困难 | 2021-07-24 | 1 |
|
| |
困难 | 2021-07-23 | 1 |
|
| |
容易 | 2021-07-12 | 1 |
|
| |
困难 | 2021-07-08 | 1 |
|
| |
中等 | 2021-07-06 | 1 |
|
| |
中等 | 2021-06-24 | 1 |
|
| |
困难 | 2021-06-21 | 1 |
|
| |
容易 | 2021-06-10 | 1 |
|
| |
中等 | 2021-06-05 | 1 |
|
| |
中等 | 2021-05-25 | 1 |
|
| |
中等 | 2021-05-20 |
|
|
| |
中等 | 2021-05-14 | 1 |
|
| |
中等 | 2021-05-11 | 1 |
|
| |
中等 | 2021-05-11 | 1 |
|
| |
中等 | 2021-04-27 | 1 |
|
| |
容易 | 2021-04-27 | 1 |
|
| |
中等 | 2021-04-25 | 1 |
|
| |
困难 | 2021-04-23 | 1 |
|
| |
中等 | 2021-04-23 | 1 |
|
| |
中等 | 2021-04-22 | 1 |
|
| |
中等 | 2021-04-15 | 1 |
|
| |
中等 | 2021-04-15 | 1 |
|
| |
中等 | 2021-04-13 | 1 |
|
| |
容易 | 2021-04-12 | 1 |
|
| |
中等 | 2021-04-12 | 1 |
|
| |
容易 | 2021-04-11 | 1 |
|
| |
容易 | 2021-04-11 | 1 |
|
| |
中等 | 2021-04-10 | 1 |
|
| |
中等 | 2021-04-09 | 1 |
|
| |
中等 | 2021-04-07 | 1 |
|
| |
中等 | 2021-04-03 |
|
|
|
字节
中等 | 2021-08-13 | 134 |
|
| |
中等 | 2021-08-13 | 104 |
|
| |
容易 | 2021-08-14 | 98 |
|
| |
中等 | 2021-08-10 | 98 |
|
| |
困难 | 2021-08-04 | 94 |
|
| |
中等 | 2021-08-12 | 84 |
|
| |
容易 | 2021-08-13 | 72 |
|
| |
中等 | 2021-07-27 | 72 |
|
| |
容易 | 2021-08-01 | 70 |
|
| |
容易 | 2021-08-10 | 61 |
|
| |
中等 | 2021-08-13 | 56 |
|
| |
困难 | 2021-08-12 | 53 |
|
| |
容易 | 2021-08-10 | 48 |
|
| |
中等 | 2021-08-11 | 47 |
|
| |
中等 | 2021-08-06 | 46 |
|
| |
容易 | 2021-08-05 | 46 |
|
| |
容易 | 2021-08-10 | 45 |
|
| |
中等 | 2021-08-09 | 45 |
|
| |
中等 | 2021-08-10 | 43 |
|
| |
容易 | 2021-08-09 | 43 |
|
| |
中等 | 2021-08-12 | 41 |
|
| |
中等 | 2021-08-11 | 40 |
|
| |
容易 | 2021-08-12 | 39 |
|
| |
中等 | 2021-08-02 | 39 |
|
| |
中等 | 2021-08-09 | 38 |
|
| |
中等 | 2021-07-28 | 38 |
|
| |
容易 | 2021-08-10 | 37 |
|
| |
中等 | 2021-08-11 | 36 |
|
| |
困难 | 2021-08-13 | 35 |
|
| |
困难 | 2021-08-12 | 35 |
|
| |
容易 | 2021-08-11 | 34 |
|
| |
中等 | 2021-08-05 | 34 |
|
| |
容易 | 2021-07-24 | 34 |
|
| |
中等 | 2021-08-11 | 33 |
|
| |
中等 | 2021-08-11 | 33 |
|
| |
中等 | 2021-08-08 | 33 |
|
| |
中等 | 2021-08-11 | 32 |
|
| |
容易 | 2021-08-02 | 31 |
|
| |
容易 | 2021-08-10 | 29 |
|
| |
困难 | 2021-08-07 |
|
|
| |
困难 | 2021-07-26 | 29 |
|
| |
中等 | 2021-08-09 | 28 |
|
| |
中等 | 2021-08-07 | 28 |
|
| |
容易 | 2021-07-22 | 27 |
|
| |
困难 | 2021-08-11 | 26 |
|
| |
中等 | 2021-08-08 | 26 |
|
| |
中等 | 2021-08-11 | 25 |
|
| |
中等 | 2021-08-13 | 24 |
|
| |
容易 | 2021-08-09 | 24 |
|
| |
中等 | 2021-07-22 | 24 |
|
| |
中等 | 2021-08-12 | 23 |
|
| |
容易 | 2021-08-07 | 23 |
|
| |
中等 | 2021-08-12 | 22 |
|
| |
中等 | 2021-08-12 | 22 |
|
| |
中等 | 2021-08-11 | 22 |
|
| |
中等 | 2021-08-03 | 22 |
|
| |
容易 | 2021-06-17 | 22 |
|
| |
中等 | 2021-08-13 | 21 |
|
| |
中等 | 2021-08-10 | 21 |
|
| |
中等 | 2021-08-10 |
|
|
| |
中等 | 2021-08-09 | 21 |
|
| |
容易 | 2021-08-04 | 21 |
|
| |
中等 | 2021-07-28 | 21 |
|
| |
中等 | 2021-06-10 | 21 |
|
| |
中等 | 2021-08-13 | 20 |
|
| |
中等 | 2021-08-09 | 20 |
|
| |
中等 | 2021-08-05 | 20 |
|
| |
中等 | 2021-07-30 | 20 |
|
| |
困难 | 2021-08-06 | 19 |
|
| |
中等 | 2021-08-05 | 19 |
|
| |
中等 | 2021-08-03 | 18 |
|
| |
中等 | 2021-07-30 | 18 |
|
| |
容易 | 2021-06-17 | 18 |
|
| |
容易 | 2021-04-16 | 18 |
|
| |
中等 | 2021-08-12 | 17 |
|
| |
容易 | 2021-08-09 | 17 |
|
| |
中等 | 2021-08-06 | 17 |
|
| |
容易 | 2021-08-04 | 17 |
|
| |
中等 | 2021-08-01 | 17 |
|
| |
容易 | 2021-07-27 |
|
|
| |
容易 | 2021-07-26 | 17 |
|
| |
中等 | 2021-08-06 | 16 |
|
| |
中等 | 2021-08-04 | 16 |
|
| |
容易 | 2021-08-03 | 16 |
|
| |
中等 | 2021-07-28 | 16 |
|
| |
容易 | 2021-07-28 | 16 |
|
| |
困难 | 2021-07-27 | 16 |
|
| |
困难 | 2021-08-10 | 15 |
|
| |
中等 | 2021-08-08 | 15 |
|
| |
容易 | 2021-08-03 | 15 |
|
| |
中等 | 2021-08-02 | 15 |
|
| |
中等 | 2021-07-26 | 15 |
|
| |
中等 | 2021-07-16 | 15 |
|
| |
中等 | 2021-08-11 | 14 |
|
| |
中等 | 2021-08-12 | 13 |
|
| |
中等 | 2021-08-12 | 13 |
|
| |
中等 | 2021-08-04 | 13 |
|
| |
中等 | 2021-07-21 | 13 |
|
| |
容易 | 2021-07-15 | 13 |
|
| |
中等 | 2021-04-23 |
|
|
|