2022年6月25日亮剑计划正式启动,直到8月初,每天回顾5道算法题,我选择的题目是剑指offer和leetcodehot100,因为这些题目基本上都是面试常考题,后面在面试之前可以多看看面经,熟悉一下每个公司对应的考过的算法题就行了
输入:
["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();
}
}
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
输入:n = 2
输出:1
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];
}
}
输入: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];
}
}
输入: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];
}
}
输入: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;
}
}