
剑指Offer
一起来手撕面试题吧。
一枚方糖
你的梦想有多远、你就能走多远✨
展开
-
『剑指Offer』64. 求1+2+…+n
文章目录题目思路代码题目思路递归求和,不给用 if 很无语。。。代码class Solution {public: int sumNums(int n) { n > 0 && (n += sumNums(n-1)); return n; }};原创 2021-11-15 20:10:07 · 544 阅读 · 0 评论 -
『剑指Offer』54. 二叉搜索树的第k大节点
文章目录题目思路代码题目思路遍历树 val 放入 vector ,然后排序输出第 K 大。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class S原创 2021-11-15 19:59:10 · 1069 阅读 · 0 评论 -
『剑指Offer』40. 最小的k个数
文章目录题目思路代码题目思路排序,取范围代码class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { sort(begin(arr),end(arr)); vector<int> res(begin(arr),begin(arr) + k); return res; }};...原创 2021-11-14 12:13:50 · 889 阅读 · 0 评论 -
『剑指Offer』58 - I. 翻转单词顺序
文章目录题目思路代码题目思路用栈把每个单词存入,在挨个输出。代码class Solution {public: string reverseWords(string s) { string res = "",temp = ""; int i = 0; stack<string> t; for(i=0 ; i < s.size() ; i++){ if (s[i] == ' ') {原创 2021-11-09 23:22:20 · 4506 阅读 · 0 评论 -
『剑指Offer』57. 和为s的两个数字
文章目录题目思路代码题目思路双指针思想。代码func twoSum(nums []int, target int) (res []int) { i, j := 0, len(nums) - 1 for i < j { if nums[i] + nums[j] == target { res = append(res, nums[i]) res = append(res, nums[j])原创 2021-11-09 23:13:31 · 254 阅读 · 0 评论 -
『剑指Offer』21. 调整数组顺序使奇数位于偶数前面
文章目录题目思路代码题目思路没啥好思路,暴力吧。代码class Solution {public: vector<int> exchange(vector<int>& nums) { vector<int> res; for (auto i : nums) if (i & 1) res.push_back(i); for (auto i : nums) if (i % 2 == 0) r原创 2021-11-09 23:08:47 · 4629 阅读 · 0 评论 -
『剑指Offer』 25. 合并两个排序的链表
文章目录题目思路代码题目思路创建哑结点,不采用创建新节点方式,直接在原地修改。最后判断 l1 或 l2 哪个不为空,直接将哑结点连接上去。代码/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ //1-3-5-7-9,2-4-6func mergeTwoLists(l1 *ListNode, l2 *ListNod原创 2021-11-08 20:35:39 · 260 阅读 · 0 评论 -
『剑指Offer』52. 两个链表的第一个公共节点
文章目录题目思路代码题目思路遍历 headA 记录节点信息,遍历 headB 发现节点出现在 headA中,找到。代码/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func getIntersectionNode(headA, headB *ListNode) *ListNode { q := map[*Li原创 2021-11-08 20:22:35 · 381 阅读 · 0 评论 -
『剑指Offer』22. 链表中倒数第k个节点
文章目录题目思路代码题目思路快慢指针先让快指针先走 k 个节点,然后 root 和 cur 节点一起后移,当 cur 到到达尾部时 root 刚好指向倒数第 k 个节点。代码/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func getKthFromEnd(head *ListNode, k int) *ListN原创 2021-11-07 21:23:58 · 278 阅读 · 0 评论 -
『剑指Offer』18. 删除链表的节点
文章目录题目思路代码题目思路写多了,没啥思路,直接删。代码/** * De原创 2021-11-07 21:18:59 · 265 阅读 · 0 评论 -
『剑指Offer』Offer 47. 礼物的最大价值
文章目录题目思路代码题目思路代码func maxValue(dp [][]int) int { n, m := len(dp), len(dp[0]) // 边界 for i := 1 ; i < m ; i++ { dp[0][i] = dp[0][i - 1] + dp[0][i] } for i := 1 ; i < n ; i++ { dp[i][0] = dp[i - 1][0] + dp[i][0]原创 2021-11-05 15:15:57 · 273 阅读 · 0 评论 -
『剑指Offer』 42. 连续子数组的最大和
文章目录题目思路代码题目思路这里使用的是 在线处理,只要 t > 0 那就一直累加,并更新最大值 res。一旦 t <= 0,那就把 t 更新成当前累加的值。代码class Solution {public: int maxSubArray(vector<int>& nums) { int n = size(nums), t = 0, res = INT_MIN; for(auto i : nums) {原创 2021-11-05 15:01:48 · 3029 阅读 · 0 评论 -
『剑指Offer』63. 股票的最大利润
文章目录题目思路代码题目思路枚举每个元素,在这个元素右边找与它差值最大的。更新最大差值 res代码暴力版本func maxProfit(prices []int) (res int) { for i := 0 ; i < len(prices) ; i++{ for j := i + 1 ; j < len(prices) ; j++ { res = max(res, prices[j] - prices[i]) }原创 2021-11-04 19:52:54 · 279 阅读 · 0 评论 -
『剑指Offer』10- II. 青蛙跳台阶问题
文章目录题目思路代码题目思路与上一题斐波那契状态转移方程相同,只是初始条件不同 dp[0] = 1; dp[1] = 1; dp[2] = 2 。代码func numWays(n int) int { const p = 1e9 + 7 dp := [101]int{1,1,2} for i := 2 ; i <= n ; i++ { dp[i] = dp[i - 1] % p + dp[i - 2] % p } return dp[原创 2021-11-04 17:15:17 · 217 阅读 · 0 评论 -
『剑指Offer』 I. 斐波那契数列
文章目录题目思路代码题目思路动态规划,初始条件 dp[0] = 0; dp[1] = 1 ,状态转移方程 dp[i] = dp[i-1] + dp[i-2] 。代码func fib(n int) int { const p = 1e9+7 dp := [101]int{0,1} for i := 2 ; i <= n ; i++ { dp[i] = dp[i - 1] % p + dp[i - 2] % p } return dp[n原创 2021-11-04 16:56:16 · 155 阅读 · 0 评论 -
『剑指Offer』27. 二叉树的镜像
文章目录题目思路代码题目思路l := mirrorTree(root.Left)r := mirrorTree(root.Right)l 和 r 的输出结果为:[9,6]、[3,1]、[7,2] 对应每个节点的左右子节点1、每次遍历获取到当前节点 root 的左右子节点 A 和 B2、再让 root.Left = B ,root.Right = A,使得每个节点下面的左右子节点完成交换代码func mirrorTree(root *TreeNode) *TreeNode {原创 2021-11-03 15:31:01 · 147 阅读 · 0 评论 -
『剑指Offer』28. 对称的二叉树
文章目录题目思路代码题目思路1、首先对 root 为空和 root 左右子节点不同 判 False2、其次我们将 root 的左右子树看成两个树 使用 isTrue 进行判断3、遍历子树 A 和 B 是否完全相同,这里注意 A.Left 与 B.Right 对应,满足对称性。代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode *原创 2021-11-03 15:03:54 · 184 阅读 · 0 评论 -
『剑指Offer』26. 树的子结构
文章目录题目思路代码题目思路一开始没写出来,对递归有点误解。二刷准备中1、遍历 A 节点过程中让 A 与 B 进行判断是否相同2、如果中途发现一个相同,则返回 True,如果遍历完毕还没有,则返回 False3、isSubStructure 是用 || 连接,因为只要 B 与 A 节点的任意一边相同,就是 True4、isTrue 用 && 连接,因为必须 A 和 B 节点,左右子树都相同才是 True代码/** * Definition for a binary tr原创 2021-11-03 14:50:05 · 150 阅读 · 0 评论 -
『剑指Offer』32 - III. 从上到下打印二叉树 III
文章目录题目思路代码题目思路这题和 『剑指Offer』 32 - II. 从上到下打印二叉树 II 类似,这次需要记录层数 depth,然后 depth 为偶数时将 t 切片反转。干巴爹!代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func reverse(s原创 2021-11-02 22:09:28 · 160 阅读 · 0 评论 -
『剑指Offer』 32 - II. 从上到下打印二叉树 II
文章目录题目思路代码题目思路这题和 从上到下打印二叉树 多了一个记录层数,所以要再开一个切片 te 储存每层元素,q 模拟队列、t 临时存储每层的值、te 记录每层的元素。每次遍历完一层用 q = te 更新队列。代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func原创 2021-11-02 22:02:05 · 136 阅读 · 0 评论 -
『剑指Offer』32 - I. 从上到下打印二叉树
文章目录题目思路代码题目思路层级遍历嘛,要是用 C++ 好写。 Go 没有队列,只能用切片模拟一下了。每次遍历切片的每个元素,并将他的两个子节点入切片,len(q)会自增长度,让循环继续下去。达到遍历每个元素的目的。模拟队列很巧妙。代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode *原创 2021-11-02 21:22:26 · 487 阅读 · 0 评论 -
『剑指Offer』04. 二维数组中的查找
文章目录题目思路代码题目思路这题有个技巧,从左下角开始移动, matrix[i][j] < x,则 j++。反之,i--。懂得都懂代码func findNumberIn2DArray(matrix [][]int, target int) bool { n := len(matrix) if n == 0 { return false } m := len(matrix[0]) i, j := n - 1 , 0 for原创 2021-11-01 13:01:34 · 136 阅读 · 0 评论 -
『剑指Offer』 11. 旋转数组的最小数字
文章目录题目思路代码题目思路遍历更新最小值代码func minArray(numbers []int) (res int) { res = 0x7fffffff for _,x := range numbers { if res >= x { res = x } } return }原创 2021-11-01 12:52:52 · 178 阅读 · 0 评论 -
『剑指Offer』 50. 第一个只出现一次的字符
文章目录题目思路代码题目思路map扫一遍,然后找出值为 1 的字符。这里的 byte 相当于字符; []byte 等价于 string ;代码func firstUniqChar(s string) byte { q := map[string]int{} for _,x := range s { q[string(x)]++ } for _,x := range s { if q[string(x)] == 1 {原创 2021-11-01 12:48:55 · 184 阅读 · 0 评论 -
『剑指Offer』 03. 数组中重复的数字
文章目录题目思路代码题目思路哈希表,遇见重复的返回。代码func findRepeatNumber(nums []int) int { q := map[int]int{} for _,x := range nums { q[x]++ } for _,x := range nums { if q[x] > 1{ return x } } return -1}...原创 2021-10-31 12:51:57 · 109 阅读 · 0 评论 -
『剑指Offer』 53 - I. 在排序数组中查找数字 I
文章目录题目思路代码题目思路遍历一下,统计 target 次数代码func search(nums []int, target int) (res int) { for _,x := range nums { if x == target { res ++ } } return }原创 2021-10-31 12:48:06 · 146 阅读 · 0 评论 -
『剑指Offer』53 - II. 0~n-1中缺失的数字
文章目录题目思路代码题目思路由于它是递增的,双指针移动,i != j 说明 i 就是缺失的。代码func missingNumber(nums []int) int { i := 0 for _,j := range nums { if i != j { return i }else { i++ } } return i}...原创 2021-10-31 12:45:19 · 146 阅读 · 0 评论 -
『剑指Offer』58 - II. 左旋转字符串
文章目录题目思路代码题目思路利用切片,分割两次累加代码func reverseLeftWords(s string, n int) string { res := s[n:] + s[:n] return res}原创 2021-10-30 10:42:57 · 158 阅读 · 0 评论 -
『剑指Offer』05. 替换空格
文章目录题目思路代码题目思路遇到空格追加%20,否则追加原字符。代码func replaceSpace(s string) string { res := string("") for i:=0 ; i<len(s) ; i++ { if s[i] == ' ' { res += "%20" }else { res += string(s[i]) } } retu原创 2021-10-30 10:36:38 · 166 阅读 · 0 评论 -
『剑指Offer』24. 反转链表
文章目录题目思路代码题目思路代码/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func reverseList(head *ListNode) *ListNode { var prev *ListNode cur := head for cur != nil { t :=原创 2021-10-29 14:33:33 · 162 阅读 · 0 评论