【面试突击算法第二天】剑指offer + Leetcode Hot100
2022年6月25日亮剑计划正式启动,直到8月初,每天回顾5道算法题,我选择的题目是剑指offer和leetcodehot100,因为这些题目基本上都是面试常考题,后面在面试之前可以多看看面经,熟悉一下每个公司对应的考过的算法题就行了
剑指 Offer 09. 用两个栈实现队列
- 题意:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
- 示例:
输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1]
- 思路:一个栈作为输入,还有一个栈作为输出,也就是先将元素写入一个栈中,然后再从该栈中出栈写入另外一个栈中,这样就可以实现
先进先出
的特性 - 代码:
class CQueue {Deque<Integer> stack1;Deque<Integer> stack2;public CQueue() {stack1 = new LinkedList<>();stack2 = new LinkedList<>();} public void appendTail(int value) {// 添加元素的时候,只需要使用输入栈stack1.push(value);}public int deleteHead() {if (stack2.isEmpty()) {// 如果不为空,那么直接出栈就行了while (!stack1.isEmpty()) {// 如果为空,就说明没有输入元素或者元素全部已经出栈stack2.push(stack1.pop());}}return stack2.isEmpty() ? -1 : stack2.pop();} }
剑指 Offer 10- I. 斐波那契数列
- 题意:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
- 示例:
输入:n = 2 输出:1
- 思路:本题如果归类到动态规划题目的话,那么这个递推公式是很容易写出来的,还有初始化部分都是很容易的,但是难点在哪呢?就是答案需要取模 1e9+7,所以需要在递推的过程中对状态取模
- 代码:
class Solution {public int fib(int n) {if (n <= 1)return n;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];dp[i] %= 1000000007;}return dp[n];} }
剑指 Offer 10- II. 青蛙跳台阶问题
- 题意:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
- 示例:
输入:n = 2 输出:2
- 思路:跟
斐波那契数列
递推公式一样,唯一的不同就是初始化的时候 - 代码:
class Solution {public int numWays(int n) {if (n <= 1)return 1;int[] dp = new int[n + 1]; dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];dp[i] %= 1000000007;}return dp[n];} }
剑指 Offer 11. 旋转数组的最小数字
- 题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。
- 示例:
输入:numbers = [3,4,5,1,2] 输出:1
- 思路:第一种想法,我们观察这个旋转后的序列有一个特点,就是转折点之前是递增序列,转折点之后是递增序列,那么该转折点其实是极小值点,因此一次遍历过程中就可以找到最小值;第二种想法,一看是一个半有序序列,联想到了二分查找 较难
- 代码:
class Solution {public int minArray(int[] numbers) {int l = 0, r = numbers.length - 1;while (l <= r) {int mid = l + (r - l) / 2;if (numbers[mid] > numbers[r]) // 排除左边部分 l = mid + 1;else if (numbers[mid] < numbers[r]) // 排除右边部分 但是mid可能就是最小值r = mid;else r -= 1; // 因为这个时候最小值有可能在mid左边,也有可能在mid右边,所以只能排除r}return numbers[l];} }
剑指 Offer 12. 矩阵中的路径
- 题意:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
- 示例:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:true
- 思路:套岛屿面积的模板
- 代码:
class Solution {public boolean exist(char[][] board, String word) {int m = board.length, n = board[0].length;boolean[][] visited = new boolean[m][n]; // 防止死循环// 从每一个位置进行递归搜索for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (dfs(board, word, visited, i, j, 0))return true;}}return false;}private boolean dfs(char[][] board, String word, boolean[][] visited, int i, int j, int index) {int m = board.length, n = board[0].length;if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j])return false;if (board[i][j] != word.charAt(index))return false;if (index == word.length() - 1)return true;visited[i][j] = true;boolean result = dfs(board, word, visited, i - 1, j, index + 1) ||dfs(board, word, visited, i + 1, j, index + 1) ||dfs(board, word, visited, i, j - 1, index + 1) ||dfs(board, word, visited, i, j + 1, index + 1);visited[i][j] = false;return result;} }
【面试突击算法第二天】剑指offer + Leetcode Hot100相关推荐
- python数据结构与算法刷题——剑指offer第二版加部分leetcode题
说不清楚,只能看代码理解的用红色标出 查找算法:查找较排序来说较简单,不外乎顺序查找和二分查找.哈希表查找和二叉排序树查找.(很多面试官喜欢让应聘者写出二分查找(如test53)的代码)[注意:二分查 ...
- 最新算法校招编程-剑指offer、Leetcode常考题目及解法分享
本资源整理了BAT.TMD等互联网算法岗校招面试过程中常考的LeetCode和剑指offer编程题:此外,还整理了部分百度.腾讯.阿里.今日头条相关的面试经验,对于正准备校招面试的同学非常值得参考复习 ...
- 算法题001 剑指Offer 面试题三:二维数组中的查找
剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...
- python连续质数计算_GitHub - xxqfft/AlgorithmsByPython: 算法/数据结构/Python/剑指offer/机器学习/leetcode...
尝试用Python实现一些简单的算法和数据结构 之前的算法和数据结构基本都是用Swift写的,现在尝试用Python实现一些简单的算法和数据结构. update 20160704 准备加入<剑指 ...
- 算法题解(剑指Offer篇)
文章目录 栈与队列(简单) *剑指 Offer 09. 用两个栈实现队列 - 12.27 剑指 Offer 30. 包含min函数的栈 - 12.27 链表(简单) *剑指 Offer 06. 从尾到 ...
- 二刷剑指Offer:剑指Offer+LeetCode(全53题)
文章目录 剑指Offer刷题 67. 剪绳子(贪心算法) 66. 机器人的运动范围(dfs) 65. 矩阵中的路径(回溯算法) 64. 滑动窗口的最大值(双端队列) 63. 数据流中的中位数 62. ...
- 【前端js】实现剑指offer|leetcode(二)——数组题目集合
文章目录 一.数组去重 1. 对排序数组去重(leetcode 26. 删除排序数组中的重复项) 2. 检查是否存在重复元素(leetcode 217. 存在重复元素) 3. 检查相邻k个元素是否存在 ...
- 算法学习之剑指offer(六)
题目1 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.*; public cl ...
- 面试mysql慢查询_剑指Offer面试题:如何定位并优化慢查询sql
1.根据慢日志定位慢查询sql 使用以下命令查看相关系统变量属性: show variables like '%query%'; 主要看这三个属性: long_query_time : 10.0000 ...
- Python 编程进阶经典算法逻辑编程 剑指Offer
目录 1. 找到数组中重复数字(字符),返回出现频次最多 2. 给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序.给定一个数,判断这个数是否在该二维数组中. 3. 从尾到头打印链表 4 ...
最新文章
- 硬盘为何会丢失数据?
- IOS-资源最小化之点九图片的使用
- (数论)51NOD 1135 原根
- JavaSE(二十四)——冒泡排序、选择排序、直接插入排序以及二分查找
- 【转】路由转发过程的IP及MAC地址变化
- 信息学奥赛C++语言: 蛇形方阵1
- java面向对象super,final,static,匿名对象,内部类学习
- 浙大慕课c语言答案,程序设计入门——C语言
- 群赛 ZOJ3741(dp) ZOJ3911(线段树)
- 关于登录chkdsk的方法
- html5扫面二维码逻辑
- 重磅!容器存储解决方案蓝皮书发布
- python github库_让pip使用git和github存储库
- XenCenter导出虚拟机
- python移动文件_python 复制/移动文件
- Spark versus Flink: Understanding Performance in Big Data Analytics Frameworks论文总结
- chrome浏览器inspect打不开解决方案
- Arrayfire E0992 命令行错误: 宏定义无效: AF_<CPU/CUDA/OPENCL>
- QC —什么是量子计算机?
- Docker笔记(精简版)