📣 独立日限时特惠: VIP通行证立减$68
楼主: AChris
跳转到指定楼层
上一主题 下一主题
收起左侧

刷题skill+编程cultivation+记录

🔗
 楼主| AChris 2019-2-14 23:50:55 | 只看该作者
全局:
02/12/2019 Day7
LeetCode 40. Combination Sum II

解题思路: 和combination I相似,要注意的就是,在递归的时候,在每一次branch的时候,同一个数只需要 branch 一次

  1. class Solution {
  2.     public List<List<Integer>> combinationSum2(int[] candidates, int target) {
  3.         
  4.         // time: O(2^n)
  5.         // space: O(n)
  6.         
  7.         // [2,5,2,1,2] -> [1, 2, 2, 2, 5]
  8.         // 5
  9.         //                           root
  10.         //                  /.        |.        \
  11.         //                 1         2          5
  12.         //              /.  \      /   \         
  13.         //             2     5    2    5
  14.         //            /  \      /   \
  15.         //           2    5     2   5
  16.         //          / \        /
  17.         //         2   5      5
  18.         
  19.         List<List<Integer>> res = new ArrayList<> ();
  20.         if (candidates == null || candidates.length == 0 || target == 0) return res;
  21.         Arrays.sort(candidates);
  22.         dfsHelper(res, candidates, target, new ArrayList<> (), 0);
  23.         return res;
  24.     }
  25.    
  26. //     // method 1
  27. //     private void dfsHelper(List<List<Integer>> res, int[] candidates, int target, List<Integer> cur, int start) {
  28. //         if (target == 0 && !res.contains(cur)) {
  29. //             // in case there is same number like two 1
  30. //             res.add(new ArrayList<> (cur));
  31. //             return;
  32. //         }
  33. //         if (target < 0 || start >= candidates.length) return;
  34.         
  35.         
  36. //         for (int i = start; i < candidates.length; i++) {
  37. //             cur.add(candidates[i]);
  38. //             dfsHelper(res, candidates, target - candidates[i], cur, i+1);
  39. //             cur.remove(cur.size() - 1);
  40. //         }
  41. //         return;
  42.    
  43.         // method 2
  44.         private void dfsHelper(List<List<Integer>> res, int[] candidates, int target, List<Integer> cur, int start) {
  45.         if (target == 0) {
  46.             // in case there is same number like two 1
  47.             res.add(new ArrayList<> (cur));
  48.             return;
  49.         }
  50.         if (target < 0 || start >= candidates.length) return;
  51.         
  52.         
  53.         for (int i = start; i < candidates.length; i++) {
  54.             // when branch, same numbe only get one branch at a time
  55.             if (i != start && candidates[i] == candidates[i-1]) continue;
  56.             cur.add(candidates[i]);
  57.             dfsHelper(res, candidates, target - candidates[i], cur, i+1);
  58.             cur.remove(cur.size() - 1);
  59.         }
  60.         return;
  61.     }
  62. }
复制代码

补充内容 (2019-2-14 23:51):
【日期更正】02/13/2019 Day8
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-15 10:57:57 | 只看该作者
全局:

02/14/2019 Day9
LeetCode 60. Permutation Sequence

解题思路: 这题主要是利用等价拆分排序的思想。
1. 首先想到,n个数,总共有n!种情况,第一位有n种情况,每种情况对应一个set,set相互之间有序,每个set有(n-1)!种情况。
2. 那么我们可以根据 k_index / (n-1) !得到我们想要的数在第几个set里面
3. k_index % (n-1)! 可以得到在那个set里面,我们要找第几个数



  1. class Solution {
  2.     // method 1: 96.03% 100%
  3.      public String getPermutation(int n, int k) {
  4.          
  5.          // time: O(n)
  6.          // space: O(n)
  7.          
  8.          //  {1,2,3,4}
  9.          //   1 -> {2,3,4}
  10.          //   2 -> {1,3,4}
  11.          //   3 -> {1,2,4}
  12.          //   4 -> {1,2,3}
  13.          //
  14.          //   k = 18 -> k = 17
  15.          //   index = k / fact[3] = 2;  k = k % fact[3] = 5
  16.          //   res = {1,2,4}
  17.          
  18.          //   k = 5
  19.          //   index = k / fact[2] = 2;  k = k % fact[2] = 1
  20.          //.  res = {1,2}
  21.          
  22.          //   k = 1
  23.          //   index = k / fact[1] = 1;  k = k % fact[1] = 0
  24.          //   res = {1}
  25.          
  26.          //   k = 0
  27.          //   index = k / fact[0] = 0;  k = k % fact[0] = 0
  28.          //   res = {}
  29.          
  30.          List<Integer> res = new ArrayList<Integer> ();
  31.          if (n == 0) new String ();

  32.          for (int i = 1; i <= n; i++) {
  33.              res.add(i);
  34.          }
  35.          
  36.          //fact[i] to store i!
  37.          int[] fact = new int[n];
  38.          fact[0] = 1;
  39.          for (int i = 1; i < n; i++) {
  40.              fact[i] = fact[i-1] * i;
  41.          }
  42.          
  43.          k = k - 1;
  44.          StringBuilder sb = new StringBuilder ();
  45.          for (int i = n - 1; i >= 0; i--) {
  46.              int index = k / fact[i];
  47.              k = k % fact[i];
  48.             
  49.              sb.append(res.get(index));
  50.              res.remove(index);
  51.          }
  52.          
  53.          return sb.toString();
  54.      }
  55.    
  56.    
  57. //     // method 2: 15.53% 100%
  58. //     // time: O(n*k)
  59. //     // space: O(n)
  60.    
  61. //     public String getPermutation(int n, int k) {
  62. //         StringBuilder sb = new StringBuilder ();
  63. //         if (n == 0) return sb.toString();
  64.    
  65. //         for (int i = 1; i <= n; i++) {
  66. //             sb.append((char)('0' + i));
  67. //         }
  68. //         for (int i = 1; i < k; i++) {
  69. //             increasePer(sb);
  70. //         }
  71. //         return sb.toString();
  72. //     }
  73.    
  74. //     private void increasePer(StringBuilder sb) {
  75. //         int firstSmall = -1;
  76. //         for (int i = sb.length() - 2; i >= 0; i--) {
  77. //             if (sb.charAt(i) < sb.charAt(i+1)) {
  78. //                 firstSmall = i;
  79. //                 break;
  80. //             }
  81. //         }
  82. //         // System.out.println("*firstSmall*" + firstSmall);
  83.         
  84. //         if (firstSmall == -1) {
  85. //             reverse(sb, 0, sb.length() - 1);
  86. //         }
  87.    
  88. //         // firstLarge must exists since sb.charAt(firstSmall) < sb.charAt(firstSmall + 1)
  89. //         int firstLarge = -1;
  90. //         for (int i = sb.length() - 1; i >= firstSmall + 1; i--) {
  91. //             if (sb.charAt(i) > sb.charAt(firstSmall)) {
  92. //                 firstLarge = i;
  93. //                 break;
  94. //             }
  95. //         }
  96. //         // System.out.println("*firstLarge*" + firstLarge);
  97. //         swap(sb, firstSmall, firstLarge);
  98. //         reverse(sb, firstSmall + 1, sb.length() - 1);
  99. //     }
  100.    
  101. //     private void reverse(StringBuilder sb, int i, int j) {
  102. //         while( i < j) {
  103. //             swap(sb, i++, j--);
  104. //         }
  105. //     }
  106.    
  107. //     private void swap(StringBuilder sb, int i, int j) {
  108. //         char temp = sb.charAt(i);
  109. //         sb.setCharAt(i, sb.charAt(j));
  110. //         sb.setCharAt(j, temp);
  111. //     }
  112. }
复制代码
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-17 03:26:01 | 只看该作者
全局:
02/15/2019 Day10

63. Unique Paths II

解题思路:
利用Dynammic Programming, 创造dist 矩阵,记录到每一个点的路线总数


  1. class Solution {
  2.     public int uniquePathsWithObstacles(int[][] obstacleGrid) {
  3.         // obstacleGrid contains n elements
  4.         // time: O(n)
  5.         // space: O(n)

  6.         // [[0, 0]]
  7.         // rowNum = 1, colNum = 2
  8.         //
  9.         // [[1, 0]]
  10.         if (obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0].length == 0) {
  11.             return 0;
  12.         }
  13.         int rowNum = obstacleGrid.length;
  14.         int colNum = obstacleGrid[0].length;
  15.         // the default value in dist[i][j] is 0 for all i, j
  16.         int[][] dist = new int[rowNum][colNum];
  17.         
  18.         for (int j = 0; j < colNum; j++) {
  19.             if (obstacleGrid[0][j] != 1) {
  20.                 dist[0][j] = 1;
  21.             } else {
  22.                 break;
  23.             }
  24.         }
  25.         
  26.         for (int i = 0; i < rowNum; i++) {
  27.             if (obstacleGrid[i][0] != 1) {
  28.                 dist[i][0] = 1;
  29.             } else {
  30.                 break;
  31.             }
  32.         }
  33.         
  34.         
  35.         for (int i = 1; i < rowNum; i++) {
  36.             for (int j = 1; j < colNum; j++) {
  37.                 if (obstacleGrid[i][j] != 1) {
  38.                     dist[i][j] = dist[i-1][j] + dist[i][j-1];
  39.                 }
  40.             }
  41.         }
  42.         
  43.         return dist[rowNum - 1][colNum - 1];
  44.     }
  45.    
  46.    
  47.     private void printMap(int[][] map) {
  48.         int rowNum = map.length;
  49.         int colNum = map[0].length;
  50.         for (int i = 0; i < rowNum; i++) {
  51.             for (int j = 0; j < colNum; j++) {
  52.                 System.out.print(map[i][j]);
  53.             }
  54.             System.out.println();
  55.         }
  56.     }
  57. }
复制代码
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-17 04:18:50 | 只看该作者
全局:
02/16/2019 Day11

Leetcode 64. Minimum Path Sum

解题思路:dynammic programming
技巧:1.可以在原矩阵上面赋值,减小空间复杂度
2. 可以将多个for loop 合为一个for loop,具体怎么合并,要好好思考,为了减小代码行数

  1. class Solution {
  2.    
  3.     // method 1: 70.79%, 100%
  4.     public int minPathSum(int[][] grid) {
  5.         // time: O(m * n)
  6.         // space: O(1)
  7.         if (grid == null || grid.length == 0 || grid[0].length == 0) return 0;
  8.         for (int i = 0; i < grid.length; i++) {
  9.             for (int j = 0; j < grid[0].length; j++){
  10.                 if (i == 0 && j != 0) grid[i][j] += grid[i][j-1];
  11.                 if (i != 0 && j == 0) grid[i][j] += grid[i-1][j];
  12.                 if (i != 0 && j != 0) grid[i][j] += Math.min(grid[i][j-1], grid[i-1][j]);
  13.             }
  14.         }
  15.         return grid[grid.length - 1][grid[0].length - 1];
  16.     }
  17.    
  18.    
  19. //     // method 2: 29.47% 100%
  20. //     public int minPathSum(int[][] grid) {
  21. //         // grid = m * n
  22. //         // time: O(m*n)
  23. //         // space: O(n)
  24.         
  25. //         if (grid == null || grid.length == 0 || grid[0].length == 0) return 0;
  26.         
  27. //         int rowNum = grid.length;
  28. //         int colNum = grid[0].length;
  29.         
  30. //         if (rowNum == 1) return IntStream.of(grid[0]).sum();
  31. //         if (colNum == 1) {
  32. //             int sum = 0;
  33. //             for (int i = 0; i < rowNum; i++) sum += grid[i][0];
  34. //             return sum;
  35. //         }
  36.         
  37. //         int[] dist = new int[colNum];
  38. //         dist[0] = grid[0][0];
  39. //         for (int j = 1; j < colNum; j++) {
  40. //             dist[j] = dist[j-1] + grid[0][j];
  41. //         }
  42.         
  43. //         for (int i = 1; i < rowNum; i++) {
  44. //             dist[0] += grid[i][0];
  45. //             for (int j = 1; j < colNum; j++) {
  46. //                 // can use Math.min
  47. //                 dist[j] = Math.min(dist[j-1], dist[j]) + grid[i][j];
  48. //             }
  49. //         }
  50. //         return dist[colNum - 1];
  51.         
  52. //     }
  53. }
复制代码
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-17 23:31:46 | 只看该作者
全局:
02/17/2019 Day12

Leetcode 73. Set Matrix Zeroes

解题思路:
这道题主要类似暴力解法。但是,空间复杂度为O(1)的方法,如果不是事先做,还是有些难想到的。

首先,对矩阵进行每个元素进行遍历,然后将每一个row和每一个col是否为0记录在第一行和第一列上。但是呢,因为第一行,第一列本身是用来记录每一行每一列的,所以,第一行第一列是不是全是0,我们需要用另外两个boolean来记录。
然后,根据所记录的first row,first col 对 matrix[1:][1:]赋值。根据row,col对第一行第一列赋值



  1. class Solution {
  2.     public void setZeroes(int[][] matrix) {
  3.         // time: O(m*n) 99.98%
  4.         // space: O(1) 100%
  5.         
  6.         if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) return;
  7.         int m = matrix.length;
  8.         int n = matrix[0].length;
  9.         boolean row = false;
  10.         boolean col = false;
  11.         
  12.         // construct indicator using first row and first column
  13.         // row and col indicates whether first row and first column are all 0
  14.         for (int i = 0; i < m; i++) {
  15.             for (int j = 0; j < n; j++) {
  16.                 if (matrix[i][j] == 0) {
  17.                     matrix[0][j] = 0;
  18.                     matrix[i][0] = 0;
  19.                     if (i == 0) row = true;
  20.                     if (j == 0) col = true;
  21.                 }
  22.             }
  23.         }
  24.         
  25.         // Use the indicator to set 0 to matrix[1:][1:]
  26.         for (int i = 1; i < m; i++) {
  27.             if (matrix[i][0] == 0) {
  28.                 for (int j = 1; j < n; j++) {
  29.                     matrix[i][j] = 0;
  30.                 }
  31.             }
  32.         }
  33.         for (int j = 1; j < n; j++) {
  34.             if (matrix[0][j] == 0) {
  35.                 for (int i = 1; i < m; i++) {
  36.                     matrix[i][j] = 0;
  37.                 }
  38.             }
  39.         }
  40.         
  41.         // Set the first row and first column
  42.         if (row) {
  43.             for (int j = 0; j < n; j++) {
  44.                 matrix[0][j] = 0;
  45.             }
  46.         }
  47.         if (col) {
  48.             for (int i = 0; i < m; i++) {
  49.                 matrix[i][0] = 0;
  50.             }
  51.         }
  52.          
  53.         return;
  54.     }
  55. }
复制代码
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-19 03:18:08 | 只看该作者
全局:

02/17/2019 Day13

Leetcode 94. Binary Tree Inorder Traversal

解题思路:
本题非常基础。主要就是中序遍历。有两种写法。
第一种,利用函数递归。
第二种,利用stack遍历。在Binary Search Tree (BST)中,进行中序遍历的结果是一组sorted的上升序列。

都要掌握。

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11.    
  12. //     // method1: recursive
  13. //     public List<Integer> inorderTraversal(TreeNode root) {
  14. //         // n elements in total
  15. //         // time: O(n) 100%
  16. //         // space: O(n) 100%
  17. //         List<Integer> res = new ArrayList<Integer> ();
  18. //         if (root == null) return res;
  19. //         helper(res, root);
  20. //         return res;
  21. //     }
  22.    
  23. //     public void helper(List<Integer> res, TreeNode root) {
  24. //         if (root == null) return;
  25. //         helper(res, root.left);
  26. //         res.add(root.val);
  27. //         helper(res, root.right);
  28. //     }
  29.    
  30.     // method2: Stack  Traversal
  31.     // in Binary Search Tree(BST), the in oder traversal going through tree with numbers increasing
  32.     // So, in order traversal is very important
  33.     public List<Integer> inorderTraversal(TreeNode root) {
  34.         
  35.         // n elements in total
  36.         // time: O(n) 55.50%
  37.         // space: O(n) 100.00%
  38.         List<Integer> res = new ArrayList<> ();
  39.         if (root == null) return res;
  40.         Stack<TreeNode> stack = new Stack<> ();
  41.         TreeNode cur = root;
  42.         
  43.         while(cur != null || !stack.isEmpty()) {
  44.             while (cur != null) {
  45.                 stack.push(cur);
  46.                 cur = cur.left;
  47.             }
  48.             cur = stack.pop();
  49.             res.add(cur.val);
  50.             cur = cur.right;
  51.         }
  52.         return res;
  53.     }
  54. }
复制代码

补充内容 (2019-2-20 02:35):
02/18/2019 Day13  日期打错了
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-20 02:37:34 | 只看该作者
全局:
02/19/2019 Day14

Leetcode 96. Unique Binary Search Trees

解题思路:这题事一到典型的dynammic programming
注意BST的特点,左子树的所有元素一定小于root,右子树的所有元素一定大于root


  1. class Solution {
  2.     public int numTrees(int n) {
  3.         // time: O(n^2) 100%
  4.         // space: O(n) 100%
  5.         
  6.         // dynammic programming
  7.         //example: [1, 2, 3]
  8.         // root: 1; left: 0; right: 2;
  9.         // root: 2; left: 1; right: 1;
  10.         // root: 3; left: 2; right: 0;
  11.         
  12.         // f(n) denotes how many unique BSTs exists given n numbers
  13.         // f(n) = f(0) * f(n-1) + f(1) * f(n-2) + ...... + f(n-1) * f(0)
  14.         
  15.         int[] res = new int[n+1];
  16.         res[0] = 1;
  17.         for (int i = 1; i <= n; i++) {
  18.             for (int j = 0; j < i; j++) {
  19.                 res[i] += res[j] * res[i - 1 - j];
  20.             }
  21.         }
  22.         return res[n];
  23.     }
  24. }
复制代码
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-21 02:15:19 | 只看该作者
全局:
02/20/2019 Day15

Leetcode 98. Validate Binary Search Tree

解题思路:
本题利用recursive的递归方法。
利用helper函数作为辅助。每个helper函数有三个输入,root,min表示root能有的最小值,max表示root能有的最大值。

解题技巧:
root的最大值最小值不知道该取什么的时候(比如最开始的时候),可以输入一个null指针,对应的min、max可以用Integer的类型的参数。Integer 是一个object,接受null的输入。
null不可输入给int型。int 型是primitive typ。

总共有8个primitive type:
1. Integer: byte, char, short, int, long
2. floating point: float, double
3. other: boolean
(void)


  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;
  5. *     TreeNode left;
  6. *     TreeNode right;
  7. *     TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11.     public boolean isValidBST(TreeNode root) {
  12.         // in total, there are n elements in the tree
  13.         //    time: O(n)  100%
  14.         //    space: O(n)  93.13%
  15.         //   
  16.         //                        10
  17.         //                    /       \
  18.         //                  8         12
  19.         //                /   \
  20.         //               7     15(invalid)
  21.         //                      so we need to store min and max
  22.         //
  23.         if (root == null) return true;
  24.         return helper(root, null, null);
  25.     }
  26.    
  27.     // use Integer here!! int cannot be null
  28.     private static boolean helper(TreeNode root, Integer max, Integer min) {
  29.         if (root == null) return true;
  30.         if (min != null && root.val <= min) return false;
  31.         if (max != null && root.val >= max) return false;
  32.         return helper(root.left, root.val, min) && helper(root.right, max, root.val);
  33.     }
  34. }
复制代码
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-21 23:55:44 | 只看该作者
全局:

02/21/2019 Day16

Leetcode 78. Subsets

解题思路:backtracking/recursive暴力解决,
注意嵌套递归的时候用的是i+1, helper(res, nums, ls, i + 1);

  1. class Solution {
  2.     public List<List<Integer>> subsets(int[] nums) {
  3.         // time: O(2^n)  100%
  4.         // space: O(2^n) 32.34%
  5.         //
  6.         // []
  7.         // [1], [1,2], [1,2,3], [1, 3]
  8.         // [2], [2,3]
  9.         // [3]
  10.         //
  11.         //  1 --------- 2 ------ 3
  12.         //  |           |
  13.         //  2 -- 3      3
  14.         //  |
  15.         //  3
  16.         //
  17.         //                      root
  18.         //              /         |     \
  19.         //             1          2      3
  20.         //           /   \        |
  21.         //          2     3       3
  22.         //         /
  23.         //        3
  24.         
  25.         List<List<Integer>> res = new ArrayList<> ();
  26.         if (nums == null || nums.length == 0) return res;
  27.         
  28.         Arrays.sort(nums);
  29.         List<Integer> ls = new ArrayList<> ();
  30.         res.add(new ArrayList<> (ls));
  31.         helper(res, nums, ls, 0);
  32.         
  33.         return res;
  34.     }
  35.    
  36.     private void helper(List<List<Integer>> res, int[] nums, List<Integer> ls, int start) {
  37.         for (int i = start; i < nums.length; i++) {
  38.             ls.add(nums[i]);
  39.             res.add(new ArrayList<> (ls));
  40.             helper(res, nums, ls, i + 1);
  41.             // recover
  42.             ls.remove(ls.size() - 1);
  43.         }
  44.         return;
  45.     }
  46. }
复制代码
回复

使用道具 举报

🔗
 楼主| AChris 2019-2-22 01:05:55 | 只看该作者
全局:
02/21/2019 Day16

Leetcode 443. String Compression

解题思路:主要是确定要用的三个指标,
cur,记录哪里需要赋值
count,当前的字母有几个
c,当前的字母

今天发现这道easy的题目也没有想象中那么简单。自己的easy题目也还是要刷啊,多多熟悉各种操作。

  1. class Solution {
  2.     // method 1
  3.     public int compress(char[] chars) {
  4.         // time: O(n) 100%
  5.         // space: O(1) 90.56%
  6.         
  7.         if (chars == null) return 0;
  8.         if (chars.length == 1) return 1;
  9.         
  10.         int cur = 0;
  11.         
  12.         for (int i = 0; i < chars.length; i++) {
  13.             char c = chars[i];
  14.             int count = 1;
  15.             
  16.             while ((i+1) < chars.length && chars[i] == chars[i+1]) {
  17.                 count++;
  18.                 i++;
  19.             }
  20.             
  21.             chars[cur++] = c;
  22.             if (count != 1){
  23.                 for (char digit: Integer.toString(count).toCharArray()) {
  24.                     chars[cur++] = digit;
  25.                 }
  26.             }
  27.         }
  28.         return cur;
  29.     }
  30.    
  31.    
  32. //     // method 2
  33. //     public int compress(char[] chars) {
  34. //         // time: O(n) 100%
  35. //         // space: O(1) 30.04%
  36.         
  37. //         if (chars == null) return 0;
  38. //         if (chars.length == 1) return 1;
  39.         
  40. //         int cur = 0;
  41.         
  42. //         for (int i = 0; i < chars.length; i++) {
  43. //             char c = chars[i];
  44. //             int count = 1;
  45. //             if ((i+1) >= chars.length || chars[i] != chars[i+1]) {
  46. //                 chars[cur++] = c;
  47. //                 continue;
  48. //             }
  49.             
  50. //             while ((i+1) < chars.length && chars[i] == chars[i+1]) {
  51. //                 count++;
  52. //                 i++;
  53. //             }
  54.             
  55. //             chars[cur++] = c;
  56. //             if (count < 10) {
  57. //                 chars[cur++] = (char) (count + '0');
  58. //             }
  59. //             else {
  60. //                 chars[cur++] = (char) (count / 10 + '0');
  61. //                 chars[cur++] = (char) (count % 10 + '0');
  62. //             }
  63. //         }
  64. //         return cur;
  65. //     }
  66. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表