面试题45. 把数组排成最小的数(一般)
面试题45. 把数组排成最小的数(一般)输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:输入: [10,2]输出: “102”
示例 2:输入: [3,30,34,5,9]输出: “3033459”
提示:0 < nums.length <= 100
说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof
思路1:定义排序规则,这里需要了解lambda
(x, y) -> (x + y).compareTo(y + x)
其他方法需要再写,这个方法可能不能过面试
代码1:1234567891011121314class Solution { public String minNumber(int[] nums) { St ...
面试题40. 最小的k个数(简单)快排思想没写
面试题40. 最小的k个数(简单)输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]
示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]
限制:
0 <= k <= arr.length <= 100000 <= arr[i] <= 10000
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof
思路1:堆排序,一个容量为k的堆(求最小的k个数就用大顶堆,反之用小顶堆),如果堆容量没到k,遍历值就直接进入,如果满了,则比较堆顶元素,如果堆顶元素大于要进来的元素,则堆顶poll,元素进堆,否则元素不进堆
代码1:1234567891011121314151617181920212223242526272829class Solution { ...
面试题38. 字符串的排列(较难)
面试题38. 字符串的排列(较难)输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:输入:s = “abc”输出:[“abc”,”acb”,”bac”,”bca”,”cab”,”cba”]
限制:1 <= s 的长度 <= 8
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof
思路:本问题其实就是求所有字符的排列组合,针对这种问题,也可以利用回溯进行解决,但要求不能重复,因此需要进行剪枝。
比如字符串 abc ,如果让我们求所有排列,肯定是:
先固定第 1 位,从 a 、b 、 c 中选一个,比如 a。在以 a 为第 1 位的前提下,固定第 2 位,从 b 、 c 中选一个,比如 b。此时第 3 位也没有可以选择的余地了,只剩下 c,这一步就走完了。退回第 2 步,依旧在第 2 位,这次选择 c 。此时第 3 位也没有可以选择的余地了,只剩下 b,这一步也走完了。退回第 1 步。从上面,你可以总结出 ...
面试题36. 二叉搜索树与双向链表/426(一般)
面试题36. 二叉搜索树与双向链表/426(一般)输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
注意:本题与主站 426 题相同:https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/
注意:此题对比原题有改动。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-s ...
面试题36. 二叉搜索树与双向链表/426(一般)
面试题36. 二叉搜索树与双向链表/426(一般)输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
注意:本题与主站 426 题相同:https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/
注意:此题对比原题有改动。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-s ...
面试题33. 二叉搜索树的后序遍历序列(一般)
面试题33. 二叉搜索树的后序遍历序列(一般)输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:输入: [1,6,3,2,5]输出: false
示例 2:输入: [1,3,2,6,5]输出: true
提示:数组长度 <= 1000
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
思路:根据二叉搜索树的定义,可以通过递归,判断所有子树的 正确性 (即其后序遍历是否满足二叉搜索树的定义) ,若所有子树都正确,则此序列为二叉搜索树的后序遍历。递归解析:
终止条件: 当i≥j ,说明此子树节点数量 ≤1 ,无需判别正确性,因此直接返回true ;
递推工作:
划分左右子树: 遍历后序遍历的 [i,j] 区间元素,寻 ...
面试题32 - III. 从上到下打印二叉树 III(一般)
面试题32 - III. 从上到下打印二叉树 III(一般)请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
12345[ [3], [20,9], [15,7]]
提示:
节点总数 <= 1000
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof
思路:二叉树的层次遍历,和leetcode102差别不大,仅加了一个行号的判断,如果是偶数就反转,否则就照常输出
代码:12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Definition for ...
面试题32 - I. 从上到下打印二叉树(一般)
面试题32 - I. 从上到下打印二叉树(一般)从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
提示:节点总数 <= 1000
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof
思路:二叉树的层次遍历
代码1:123456789101112131415161718192021222324252627282930313233/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val ...
面试题26. 树的子结构(一般)
面试题26. 树的子结构(一般)输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
123 4 /1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:输入:A = [1,2,3], B = [3,1]输出:false
示例 2:输入:A = [3,4,5,1,2], B = [4,1]输出:true
限制:0 <= 节点个数 <= 10000
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
思路:递归求解思路
前序遍历每个节点(递归)
判断以每个节点为根的树是否满足(递归)
算法流程如下名词规定:树 A 的根节点记作 节点 A ,树 B的根节点称为 节点 B 。
isSubStructurehelper(A, B) 函数: ...
面试题22. 链表中倒数第k个节点(简单)
面试题22. 链表中倒数第k个节点(简单)输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:123给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof
思路:快慢指针的思路,当快指针走了k步时,慢指针开始移动,这样当快指针到链表结尾时,慢指针指向倒数第k个节点
代码:1234567891011121314151617181920/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode nex ...