- 博客(120)
- 资源 (2)
- 收藏
- 关注
原创 【基础知识】Go源码文件解析
Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。环境变量 GOPATH 指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件。源码文件又分为三种,即:命令源码文件、库源码文件和测试源码文件,它们都有着不同的用途和编写规则。命令源码文件命令源码文件是每个可独立运行的程序的运行入口,属于main包,包含一个无参数声明且无结果声明的main函数,可通过go run命令运行,可接收命令行参数。我们可以通过构建或安装,生成与其对应的可执行文件,这
2021-07-16 18:33:10 1197 1
原创 【基础知识】Go语言的代码组织方式
环境变量GoRoot: 包含Go 语言安装根目录的路径,也就是 GO 语言的安装路径。GoPath: 包含若干工作区目录的路径,是我们自己定义的工作空间。GoBin: 用于放置GO 程序生成的可执行文件的路径。工作区src子目录:放置源码文件的目录。pkg子目录:放置归档文件的目录。bin子目录:放置可执行文件的目录(仅在未设置全局环境变量GOBIN时有用)。代码包与许多编程语言一样,Go 语言的源码也是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与src子目录下的某个子目
2021-07-15 16:50:27 634
原创 【面试题】序列化二叉树(DFS+BFS)
题目描述解法一:层序遍历(BFS)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Codec { // Encodes a tree to a single strin
2020-09-02 09:03:50 326 1
原创 【面试题】除自身以外数组的乘积(三种解法)
题目描述解法一:构造前、后缀乘积数组class Solution(object): def productExceptSelf(self, nums): """ :type nums: List[int] :rtype: List[int] """ left = [1]+ [0]*(len(nums)-1) # 第一个元素左边没有元素,则前缀乘积记为 1 right = [0]*(len(nums)
2020-09-01 22:15:00 553
原创 【面试题】缺失的第一个正数(原地哈希法,双语言实现)
题目描述解法:原地哈希法class Solution { public int firstMissingPositive(int[] nums) { if(nums.length == 0) return 1; // 缺失的第一个整数在 [1, len + 1] 之间 for(int i=0; i<nums.length; i++) { // 遍历数组,将每个数据放到其对应的位置上,比如 1就放到 nums[0]的位置,2就填充到 nums[1], 如果
2020-09-01 09:33:26 218
原创 【面试题】直方图最大矩形面积
题目描述单调栈法class Solution(object): def largestRectangleArea(self, heights): """ :type heights: List[int] :rtype: int """ stack = [] # 借助单调栈实现,即栈中存放的柱形对应的高度只增不减 ''' 需考虑两种特性情况: 1. 弹栈的时候,栈为空;
2020-09-01 09:19:06 362
原创 【面试题】全排列系列问题
题目一解法一:回溯法(dfs实现)这个问题可以看作有 n 个排列成一行的空格,我们需要从左往右依此填入题目给定的 n 个数,每个数只能使用一次。那么很直接的可以想到一种穷举的算法,即从左往右每一个位置都依此尝试填入一个数,看能不能填完这 n 个空格,在程序中我们可以用「回溯法」来模拟这个过程。定义递归函数 backtrack(index,path)表示当前从左往右填到第 index个位置上的排列结果为 path。整个递归函数分为两种情况:若 index == n,说明我们已经填完了 n个位置(
2020-08-28 21:25:16 415
原创 【面试题】岛屿数量(DFS+BFS)
题目描述解法一:DFS染色法,扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。最终岛屿的数量就是我们进行深度优先搜索的次数。class Solution { public int numIslands(char[][] grid) { if(grid.length == 0 || grid[0].length == 0) return 0; int rows = gri
2020-08-09 11:55:54 664
原创 【面试题】正则表达式匹配(动态规划)
题目描述详细题解参考class Solution { public boolean isMatch(String s, String p) { int n = s.length(); int m = p.length(); boolean[][] dp = new boolean[n+1][m+1]; //多开一行一列,方便处理主串或模式串为空串的情况 for(int i=0; i<=n ;i++) {
2020-08-06 10:17:27 320
原创 【面试题】把字符串转成整数
题目描述题目要求结果要在 int型的数值范围内,注意数字越界处理。class Solution { public int strToInt(String str) { if(str.length() == 0) return 0; int sign = 1; int res = 0; int boundary = Integer.MAX_VALUE / 10; // res不能超过 int32的数值范围 int n
2020-08-06 10:16:43 199
原创 【面试题】数字序列中某一位的数字(迭代+ 求整/取余)
题目描述题解详细题解参考class Solution { public int findNthDigit(int n) { if(n == 0) return 0; // 第 0位即第一个数字 0 int digit = 1; // n所在数字的位数,初始化为 1位数 long start = 1; // 每 digit位数的起始数字(即1,10,100,1000,...),初始化为 1 long count = 9*start
2020-08-04 14:21:36 289
原创 【面试题】礼物的最大价值(DP及其优化策略)
题目描述解法一:动态规划class Solution { public int maxValue(int[][] grid) { int rows = grid.length; int cols = grid[0].length; int[][] dp = new int[rows][cols]; dp[0][0] = grid[0][0]; // 初始化第一个格子,到达单元格 (0,0)时能拿到礼物的最大累计价值为 grid[0
2020-08-02 16:59:13 270
原创 【面试题】股票买卖系列问题(一个 dp框架打尽 6道题目)
题目一解法一class Solution { public int maxProfit(int[] prices) { if(prices.length == 0) return 0; int[][] dp = new int[prices.length][2]; // 只能交易一次,dp[i][j]表示的是第 i天有没有持有股票(j只有两种状态,0 表示不持有或 1表示持有) dp[0][0] = 0; /* 因
2020-08-02 11:13:14 409 1
原创 【面试题】最长不含重复字符的子字符串(三种解法,Java、Python实现)
题目描述解法一:动态规划+哈希表查找class Solution { public int lengthOfLongestSubstring(String s) { if(s.isEmpty()) return 0; // 等同于判断 s.length()是否等于0 char[] charArray = s.toCharArray(); // 转为字符数组,方便后续遍历 HashMap<Character, Integer> map
2020-08-02 10:01:59 588
原创 【面试题】判断一个字符串是否能表示有效的数值(Java、Python实现)
题目描述解法一:逐位判断+标记法class Solution { public boolean isNumber(String s) { if(s == null || s.length() == 0) return false; // s为空对象或 s长度为0(空字符串)时, 不能表示数值 boolean isNum = false, isDot = false, ise_or_E = false; // 标记是否遇到数位、小数点、‘e’或'E'
2020-07-30 22:03:45 347
原创 【面试题】把数字翻译成字符串(动态规划+使用滚动变量优化空间效率+数学法进一步优化空间效率)
题目描述解法一:常规动态规划状态定义:dp[i] 表示以第 i 位数字结尾的数字子串对应的翻译方案数状态转移方程:初始状态:dp[0] = 1, dp[1] =1,即 “无数字” 和 “第 1 位数字” 的翻译方法数量均为 1。Javaclass Solution { public int translateNum(int num) { String s = String.valueOf(num); // 为方便获取数字的各个位上的数,先将其转为字符串再进行遍
2020-07-30 22:02:59 269
原创 【面试题】圆圈中最后剩下的数字(环形链表法+数学法)
题目描述解法一:模拟环形链表这道题如果模拟实现的话其实考的是「循环单向链表」(链表尾指向链表头部,且每个结点只有一个后继结点),由于 Java 里面没有现成的类库可以使用,因此先尝试用 LinkedList 发现超时,然后用 ArrayList。Javaclass Solution { public int lastRemaining(int n, int m) { /* 若使用 LinkedList 会超时 LinkedList 虽然删除指
2020-07-28 20:05:45 284
原创 【面试题】剪绳子问题(动态规格+贪心算法,考虑大数问题)
题目一解法一:动态规划class Solution { public int cuttingRope(int n) { if(n <= 1) return 0; // 题目要求至少需要切一次,长度小于2没法切 if(n == 2) return 1; // 1*1=2 if(n == 3) return 2; // 1*2=2 int[] dp = new int[n+1]; // dp数组中第 i-1个元素存放把长度为 i
2020-07-28 20:03:49 416
原创 【面试题】树中两个节点的最近公共祖先
二叉搜索树的最近公共祖先题解参考解法一:迭代法Java/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public TreeNode lowestCommo
2020-07-26 11:34:33 610
原创 【面试题】滑动窗口的最大值(两种解法+Java、Python双语言实现)
题目描述解法一:暴力法最简单直接的方法是遍历每个滑动窗口,找到每个窗口的最大值。假设数组的长度为n,则一共有 n - k + 1 个滑动窗口,每个滑窗有 k 个元素,遍历 n - k + 1次,每次从 k个数中寻找最大值,于是算法的时间复杂度为 O(n*k),表现较差。Javaclass Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length == 0 || nums.leng
2020-07-25 16:51:56 541
原创 【面试题】二叉搜索树的第k大节点
题目描述题解参考:中序遍历倒序法Java/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ // 中序遍历的倒序即为节点值的递减序列class Solution { int res=0, cou
2020-07-25 16:02:53 174
原创 【面试题】翻转单词顺序(两种解法+题目变体解析)
题目描述解法一:双指针,倒数遍历Javaclass Solution { public String reverseWords(String s) { s = s.trim(); // 删除输入字符串首尾的空格 int i = s.length()-1, j = i; // 记录单词左右边界的索引,初始化指向字符串的尾字符 StringBuilder res = new StringBuilder(); while(i >
2020-07-20 20:14:50 412
原创 【面试题】n个骰子的点数(动态规划法)
题目描述动态规划class Solution { public double[] twoSum(int n) { // pre[]记录前 n-1个骰子的点数概率数组,初始只有一个骰子,点数概率数组显然是 6个 1/6 double pre[]={1/6d,1/6d,1/6d,1/6d,1/6d,1/6d}; /* 从第二个骰子开始,每加一个骰子,就更新pre[] 数组 根据1个骰子的点数概率数组求出2个骰子的点数
2020-07-20 20:13:48 283
原创 【面试题】两个链表的第一个公共节点(两种解法)
题目描述解法一:剑指offer上的题解首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,在较长的链表上先走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的第一个公共节点。时间复杂度为O(m+n),m、n分别为两个链表的长度。空间复杂度为O(1),只使用了几个常量(三个int,两个ListNode)。Java/** * Definition for singly-linked list. * public cla
2020-07-17 21:25:45 1600 1
原创 【面试题】数字在排序数组中出现的次数(两种解法)
题目描述解法一:剑指offer上的思路Javaclass Solution { public int search(int[] nums, int target) { if(nums.length == 0) return 0; int firstIndex = getFirstTarget(nums, 0, nums.length-1, target); int lastIndex = getLastTarget(nums, 0, nums.
2020-07-17 00:16:02 149
原创 【面试题】二叉树的深度(三种题目变体解析,DFS/BFS两种方法,Java/Python双语言实现)
题目描述解法一:层序遍历(BFS)按层遍历树的所有节点,每遍历完一层,最大深度+1,直到最后一个叶子节点。这其实就是广度优先搜索的策略,BFS一般借助队列实现。Java/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }
2020-07-15 19:32:44 354
原创 【面试题】数组中的逆序对(归并排序)
题目描述Javaclass Solution { public int reversePairs(int[] nums) { int len = nums.length; if(len < 2) return 0; // 当数组中不足2个元素时,数对都不存在,直接返回 0 // 由于是一边归并排序一边计算逆序对个数的,我们的算法是会修改原始数组的,如果不允许修改,则需要将原始数组做一个拷贝 int[] copy = new
2020-07-14 20:21:15 185
原创 【面试题】第一个只出现一次的字符(三种解法)
题目描述解法一:哈希表计数法需要从头开始扫描字符串两次。 第⼀次扫描字符串时, 每扫描到⼀个字符就在哈希表的对应项中把次数加1。 接下来第⼆次扫描时, 每扫描到⼀个字符就能从哈希表中得到该字符出现的次数。 当遇到第⼀个只出现⼀次的字符就是符合要求的结果。javaclass Solution { public char firstUniqChar(String s) { HashMap<Character, Integer> map = new HashMap&l
2020-07-12 16:56:42 2347
原创 【面试题】丑数(动态规划)
题目描述解题思路根据丑数的定义, 丑数应该是另⼀个丑数乘以 2、 3或者 5的结果(1除外),满足递推性质 。 因此我们可以创建⼀个数组, ⾥⾯的数字是排好序的丑数, 每⼀个丑数都是前⾯的丑数乘以 2、 3或者 5得到的。Java动态规划法class Solution { public int nthUglyNumber(int n) { if(n <= 0) return 0; int[] dp = new int[n]; // 定义状态表,dp
2020-07-12 15:11:36 373
原创 【面试题】把数组排成最小的数(自定义排序)
题目描述题解思路此题求拼接起来的 “最小数字” ,本质上是一个排序问题。这道题其实是希望我们能找到⼀个排序规则, 数组根据这个规则排序之后能排成⼀个最小的数字。要确定排序规则, 就要比较两个数字, 也就是给出两个数字 x和 y, 我们需要确定⼀个规则判断 x和 y哪个应该排在前⾯, 而不是仅仅是⽐较这两个数字的值哪个更⼤。对于数字的拼接,需要考虑到潜在的“大数问题”,就是 x 和 y 都在 int 型能表达的范围内, 但把它们拼起来的数字 xy 和 yx 用 int 表⽰就有可能溢出了。⼀个⾮常
2020-07-11 10:58:43 347
原创 【面试题】最小的k个数(三种解法)
题目描述解法一:排序法Javaclass Solution { public int[] getLeastNumbers(int[] arr, int k) { if(k ==0 || arr.length == 0) return new int[0]; if(k == arr.length) return arr; Arrays.sort(arr); // 从小到大排序 return Arrays.copyOfRange(a
2020-07-07 11:37:45 425
原创 【面试题】数组中出现次数超过一半的数字(三种解法详解)
题目描述解法一:哈希表统计法遍历数组 nums,用 HashMap 统计各数字出现的次数,最终超过数组长度一半的数字则为要查找的结果。此方法时间和空间复杂度均为 O(N)。Javaclass Solution { HashMap<Integer, Integer> map = new HashMap<> (); public int majorityElement(int[] nums) { if(nums.length == 0) retu
2020-07-06 21:50:34 2533
原创 【面试题】复杂链表的复制(两种解法)
题目描述解法一:通过哈希表辅助查找第⼀步先复制结点的值,针对原始链表上的每个结点 N,在新链表上创建对应的结点 N’ 并复制 N的值,同时我们把<N, N’>的配对信息放到⼀个哈希表中。第⼆步是复制结点的指针,把这些复制链表上新创建出来的结点⽤ next指针链接起来,并设置复制链表上每个结点的 random指向。如果在原始链表中结点 N的 random指向结点S, 那么在复制链表中, 对应的N’的 random应该指向S’。 由于有了哈希表, 我们可以⽤O(1) 的时间根据 S找到
2020-07-04 10:57:58 470
原创 【面试题】从上到下打印二叉树(三种题目变体+多种解题思路)
题目1这个问题实际上就是考察树的广度优先搜索,也就是按层遍历,BFS一般借助队列实现。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public int[] l
2020-06-30 10:13:15 242
原创 【面试题】包含min函数的栈(辅助栈法+无需辅助栈法)
题目描述解法一:辅助栈法普通栈的 push() 和 pop() 函数的复杂度为 O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N) 。为了将 min() 函数复杂度降为 O(1),可通过建立辅助栈实现。Javaclass MinStack { LinkedList<Integer> stack1, stack2; /** initialize your data structure here. */ public MinStack(
2020-06-29 12:28:54 340
原创 【面试题】顺时针打印矩阵(两种解法 Java实现)
题目描述由于是以从外圈到内圈的顺序依次打印, 我们可以把矩阵想象成若⼲个圈,循环打印,每次打印一个圈,循环结束的条件是当前圈的左上角坐标(startX,startY)满足 startX*2 >= cols && startY*2 >= rows我们可以把顺时针打印⼀圈分为四步走:第⼀步从左到右打印⼀⾏,第⼆步从上到下打印⼀列,第三步从右到左打印⼀⾏,第四步从下到上打印⼀列。不过,要注意的是,最后⼀圈有可能退化成只有⼀⾏、 只有⼀列, 甚⾄只有⼀个数字,此时打
2020-06-28 22:10:47 390
原创 【面试题】二叉树的子结构
题目描述第⼀步,在树A中查找与根结点的值⼀样的结点, 这实际上就是树的遍历。可以⽤递归的⽅法去遍历, 也可以⽤循环的⽅法去遍历。第⼆步,是判断树 A中以 R为根结点的⼦树是不是和树 B具有相同的结构。 同样也可以⽤递归的思路来考虑: 如果结点 R的值和树 B的根结点不相同, 则以 R为根结点的⼦树和树 B肯定不具有相同的结点; 如果它们的值相同, 则递归地判断它们各⾃的左右结点的值是不是相同。 递归的终⽌条件是我们到达了树A或者树B的叶结点。Java/** * Definition for
2020-06-27 16:49:11 192
原创 【面试题】链表中倒数第k个节点(两种解法)
题目描述为了实现只遍历链表⼀次就能找到倒数第k个结点, 我们可以定义两个指针,初始化均指向头结点。第⼀个指针 p1从链表的头指针开始遍历向前⾛ k-1 步, 第⼆个指针 p2保持不动;从第k步开始, 第⼆个指针也开始从链表的头指针开始遍历,即双指针共同移动;由于两个指针的距离保持在 k-1, 当第⼀个(⾛在前⾯的) 指针到达链表的尾结点时, 第⼆个指针(⾛在后⾯的) 指针与尾结点的距离为 k-1,正好是倒数第k个结点。考虑到代码的鲁棒性,还需要对一些特殊情况进行处理:输入链表为空输入链表
2020-06-27 10:58:48 361
原创 【面试题】打印从1到最大的n位数(大数表示问题)
题目描述解题思路考虑以下两个问题:最大的 n位数(记为 end)与位数 n之间的关系:例如,最大的 1位数是9,最大的 2位数是 99 ,最大的 3 位数是 999 ,以此类推,end=10n - 1大数越界问题:当 n 较大时,end 会超出 int32 整型的取值范围,超出取值范围的数字无法正常存储。(但由于本题要求返回 int 类型数组,相当于默认所有数字都在 int32 整型取值范围内,因此这里不用考虑大数越界问题。感觉 LeetCode 这么设置失去了剑指offer上这题的本意。。。)
2020-06-26 11:07:53 474
MATLAB图像处理实例详解(高清PDF)
2018-08-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人