【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题

文章目录

  • 【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题
    • 03. 数组中重复的数字(easy)
    • 04. 二维数组中的查找(medium)
    • 05. 替换空格(easy)
    • 06. 从尾到头打印链表(easy)
    • 07. 重建二叉树(medium)
    • 09. 用两个栈实现队列(easy)
    • 10-Ⅰ. 斐波那契数列(easy)
    • 10-Ⅱ. 青蛙跳台阶问题(easy)
    • 11. 旋转数组的最小数字(easy)

03. 数组中重复的数字(easy)

剑指 Offer 03. 数组中重复的数字

题目】找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

限制:

2 <= n <= 100000

示例

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

解题思路

方法一:Set集合

class Solution {public int findRepeatNumber(int[] nums) {Set<Integer> set = new HashSet<>();for (int x : nums) {if (set.contains(x)) {return x;} else {set.add(x);}}return -1;}
}

方法二:排序

class Solution {public int findRepeatNumber(int[] nums) {Arrays.sort(nums);for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1]) {return nums[i];}}return -1;}
}

方法三:频次统计

class Solution {public int findRepeatNumber(int[] nums) {int []spot = new int[nums.length];for (int i : nums) {if (spot[i] == 0) {spot[i]++;} else {return i;}}return -1;}
}

方法四:

遍历nums,将nums[i]的值作为下标,将对应下标处的值标记为相反数,若下标nums[i]处已经是负数,则说明数字重复出现,注意0要单独计算

class Solution {public int findRepeatNumber(int[] nums) {boolean hasZero = false;for (int i = 0; i < nums.length; i++) {int x = Math.abs(nums[i]);if (x == 0) {if (hasZero) return 0;hasZero = true;}if (nums[x] < 0) return x;nums[x] = -nums[x];}return -1;}
}

04. 二维数组中的查找(medium)

剑指 Offer 04. 二维数组中的查找

题目】 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

限制:

  • 0 <= n <= 1000
  • 0 <= m <= 1000

示例

现有矩阵 matrix 如下:
[[1,   4,  7, 11, 15],[2,   5,  8, 12, 19],[3,   6,  9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。

解题思路

示例中的矩阵从副对角线看就像一颗二叉查找树,左边的小于它,下边的大于它

class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;int i = matrix[0].length - 1, j = 0;while (i > -1 && j < matrix.length) {if (matrix[j][i] == target) {return true;} else if (matrix[j][i] < target) {j++;} else {i--;}}return false;}
}

05. 替换空格(easy)

剑指 Offer 05. 替换空格

题目】请实现一个函数,把字符串 s 中的每个空格替换成"%20"

限制:

0 <= s 的长度 <= 10000

示例

输入:s = "We are happy."
输出:"We%20are%20happy."

解题思路

方法一:调用库函数

class Solution {public String replaceSpace(String s) {return s.replace(" ", "%20");}
}

方法二:模拟法

class Solution {public String replaceSpace(String s) {StringBuffer sb = new StringBuffer();for (char c : s.toCharArray()) {if (c == ' ') {sb.append("%20");} else {sb.append(c);}}return sb.toString();}
}

06. 从尾到头打印链表(easy)

剑指 Offer 06. 从尾到头打印链表

题目】输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

限制:

0 <= 链表长度 <= 10000

示例

输入:head = [1,3,2]
输出:[2,3,1]

解题思路

方法一:栈

class Solution {public int[] reversePrint(ListNode head) {Stack<Integer> stack = new Stack<>();while (head != null) {stack.push(head.val);head = head.next;}int[] res = new int[stack.size()];int i = 0;while (!stack.isEmpty()) {res[i++] = stack.pop();}return res;}
}

方法二:二次遍历

class Solution {public int[] reversePrint(ListNode head) {if (head == null) return new int[]{};int count = 0;for (ListNode p = head; p != null; p = p.next) count++;int[] res = new int[count];for (ListNode p = head; p != null; p = p.next) res[--count] = p.val;return res;}
}

07. 重建二叉树(medium)

剑指 Offer 07. 重建二叉树

题目】输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

限制:

0 <= 节点个数 <= 5000

示例

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:3/ \9  20/  \15   7

解题思路

不难发现,先序遍历数组的第一个值是根结点3,在中序遍历的数组中,根节点将左右子树分为了左右两个子数组;在根节点之后遍历完左子树(只有一个结点9,此结点作为子树的根结点,子结点都为空)后,先序遍历中20作为右子树的根结点,在中序遍历中20又将子数组划分为两个子数组,以此递归下去…

class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {return helper(preorder, inorder, 0, 0, inorder.length - 1);}private TreeNode helper(int[] preorder, int[] inorder, int cur, int begin, int end) {if (begin > end) return null;TreeNode node = new TreeNode(preorder[cur]);int mid = begin;while (mid <= end && inorder[mid] != node.val) mid++;node.left  = helper(preorder, inorder, cur + 1, begin, mid - 1);node.right = helper(preorder, inorder, cur + mid - begin + 1, mid + 1, end);return node;}
}

09. 用两个栈实现队列(easy)

剑指 Offer 09. 用两个栈实现队列

题目】用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

提示:

  • 1 <= values <= 10000
  • 最多会对 appendTail、deleteHead 进行 10000 次调用

示例

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
--------------------------------------------------------
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

解题思路

详细见代码

class CQueue {Stack<Integer> sa;Stack<Integer> sb;public CQueue() {sa = new Stack<Integer>();sb = new Stack<Integer>();}public void appendTail(int value) {sa.push(value);}public int deleteHead() {if (sa.isEmpty() && sb.isEmpty()) return -1;if (sb.isEmpty()) {while (!sa.isEmpty()) sb.push(sa.pop());}return sb.pop();}
}

10-Ⅰ. 斐波那契数列(easy)

剑指 Offer 10- I. 斐波那契数列

题目】写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。

斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 01 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1

提示:

  • 0 <= n <= 100

示例

输入:n = 5
输出:5

解题思路

方法一:动态规划

class Solution {public int fib(int n) {if (n == 0 || n == 1) return n;int[] dp = new int[n + 1];dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];if (dp[i] > 1000000007) dp[i] -= 1000000007;}return dp[n];}
}

方法二:迭代法

class Solution {public int fib(int n) {if (n == 0 || n == 1) return n;int f1 = 0, f2 = 1;for (int i = 2; i <= n; i++) {int t = f2;f2 += f1;if (f2 > 1000000007) f2 -= 1000000007;f1 = t;}return f2;}
}

10-Ⅱ. 青蛙跳台阶问题(easy)

剑指 Offer 10- II. 青蛙跳台阶问题

题目】一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。

求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1

提示:

  • 0 <= n <= 100

示例

输入:n = 7
输出:21

【解题思路】

同上斐波那契数列

class Solution {public int numWays(int n) {long f0 = 1,  f = 1;for (int i = 2; i <= n; i++) {long t = f;f = (f0 + f) % 1000000007;f0 = t;}return (int)f;}
}

11. 旋转数组的最小数字(easy)

剑指 Offer 11. 旋转数组的最小数字

题目】把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2][1,2,3,4,5] 的一个旋转,该数组的最小值为1

示例

输入:[2,2,2,0,1]
输出:0

解题思路

方法一:排序

【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题相关推荐

  1. 《剑指offer》第1~11题:刷题week1[C++题解]

    文章目录 1. 找出数组中重复的数字 思路一:排序 思路二:hash表 思路三:原地交换 2. 不修改数组找出重复的数字 思路:抽屉原理+二分 3. 二维数组中的查找 思路:思维题(选取右上角的值) ...

  2. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  3. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

    [剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...

  4. 【LeetCode 剑指offer刷题】矩阵题1:4 有序矩阵中的查找( 74. Search a 2D Matrix )(系列)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 74. Search a 2D Matrix Write an efficient algorithm that s ...

  5. Leetcode剑指offer(五)

    Leetcode剑指offer 31从上到下打印二叉树 II(32-2.Easy) 1)题目要求 2)我的解法 3)其他解法 4)自己的优化代码 5)学到的东西 32.从上到下打印二叉树 III(32 ...

  6. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 101. Symmetric Tree /**  * Definition for a binary tree no ...

  7. 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...

  8. 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 67 把字符串转成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符 ...

  9. 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Kth Smallest Element in a BST Given a binary search tree, ...

  10. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer

    题目难度: 中等 原题链接 今天继续更新剑指 offer 系列, 这道题相比昨天那道题多了个每层打印方向不同的需求, 聪明的你想到应该如何实现了吗? 老样子晚上 6 点 45 分准时更新公众号 每日精 ...

最新文章

  1. Mysql中varchar类型的猫腻!
  2. 为什么全网 都在说 iOS 开发不行了 ?
  3. 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第10章-带有分层领航者的多智能体系统的混杂协调
  4. 一只青蛙跳向三个台阶_青蛙跳台阶
  5. 【Python】刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...
  6. FFmpeg优化 苏宁PP体育视频剪切效率提升技巧
  7. vue 分模块打包 脚手架_Vue面试官最爱的底层源码问题,你可以这样回答!
  8. Ranger-Yarn插件安装
  9. 一些特殊的电脑快捷键
  10. Leetcode每日一题:1002.find-common-characters(查找常用字符串)
  11. mysql 64位更改密码_win10卸载原mysql安装64位mysql5.7并修改root密码
  12. access升级mysql_将现有的Access数据库升级为SQL
  13. Webservice 的安全
  14. 20200125每日一句
  15. 机器学习的数学基础——线性代数篇(一)
  16. Android鞋店管理系统,鞋店进销管理系统下载
  17. ECAP等通道转角挤压详解
  18. dubbo服务出现大量超时问题
  19. 2022-02-15:扫地机器人。 房间(用格栅表示)中有一个扫地机器人。 格栅中的每一个格子有空和障碍物两种可能。 扫地机器人提供4个API,可以向前进,向左转或者向右转。每次转弯90度。 当扫地机
  20. 内网穿透的作用 免费内网穿透有哪些 可以用来干什么

热门文章

  1. 使用 Python 和 Bitly 缩短您的 URL
  2. 电机是怎么转的?(电机原理+电机控制+电机分类)
  3. MySQL主从——GTID主从
  4. 一个机械研究生在计算机与机械之间的徘徊与思考-(下)之填坑
  5. AP作为WLAN用户接入认证点的PEAP用户接入流程
  6. 巴菲特致股东的一封信:2003年
  7. 手机连接电脑热点 显示 连接超时,已解决
  8. 智慧时代,如何让路口交通安全又高效?
  9. 《袁老师访谈录》第一期|吴恩柏教授/香港科大协理副校长:【成功,说到底要非常专注!】...
  10. 层次分析法(参考:清风)