2022年6月25日亮剑计划正式启动,直到8月初,每天回顾5道算法题,我选择的题目是剑指offer和leetcodehot100,因为这些题目基本上都是面试常考题,后面在面试之前可以多看看面经,熟悉一下每个公司对应的考过的算法题就行了
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
class Solution {
public int findRepeatNumber(int[] nums) {
int i = 0;
while (i < nums.length) {
if (nums[i] == i) {
i++;
continue;
}
// 有重复的元素
if (nums[nums[i]] == nums[i])
return nums[i];
// 放到正确的位置上
swap(nums, nums[i], i);
}
return -1;
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
[
[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。
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix.length == 0)
return false;
int m = matrix.length, n = matrix[0].length;
int i = 0, j = n - 1;
while (i < m && j >= 0) {
if (matrix[i][j] > target) {// 目标小 列-1
j--;
} else if (matrix[i][j] < target) {// 目标大 行+1
i++;
} else {
return true;
}
}
return false;
}
}
输入:s = "We are happy."
输出:"We%20are%20happy."
.replace(" ", "%20");也可以采用遍历字符串的方式,只是需要创建一个StringBuidler来存放元素class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
for (char ch : s.toCharArray()) {
if(ch == ' '){
sb.append("%20");
}else{
sb.append(ch);
}
}
return sb.toString();
}
}
输入:head = [1,3,2]
输出:[2,3,1]
class Solution {
public int[] reversePrint(ListNode head) {
Deque<Integer> stack = new LinkedList<>();
while (head != null) {
stack.push(head.val);
head = head.next;
}
int[] res = new int[stack.size()];
for (int i = 0; i < res.length; i++)
res[i] = stack.pop();
return res;
}
}
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return dfs(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
// preLeft/inLeft 前/中序遍历的左边界
// preRight/inRight 前/中序遍历的右边界
private TreeNode dfs(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight) {
if (preLeft > preRight || inLeft > inRight)
return null;
int rootVal = preorder[preLeft];
int index = -1;
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == rootVal)
index = i;
}
// 根节点
TreeNode root = new TreeNode(rootVal);
// 左子树
root.left = dfs(preorder, preLeft + 1, preLeft + (index - inLeft), inorder, inLeft, index - 1);
// 右子树
root.right = dfs(preorder, preLeft + (index - inLeft) + 1, preRight, inorder, index + 1, inRight);
return root;
}
}