- 纯编程题
- 1.两数之和(简单)">1.两数之和(简单)
- 1108. IP地址无效化(简单)">1108. IP地址无效化(简单)
- 344.反转字符串(简单)">344.反转字符串(简单)
- 剑指 Offer 58 - I. 翻转单词顺序(简单)">剑指 Offer 58 - I. 翻转单词顺序(简单)
- 125.验证回文串 (简单)">125.验证回文串 (简单)
- 9.回文数(简单)">9.回文数(简单)
- 58.最后一个单词的长度(简单)">58.最后一个单词的长度(简单)
- 剑指Offer 05.替换空格(简单)">剑指Offer 05.替换空格(简单)
- 剑指Offer 58 - II.左旋转字符串(简单)">剑指Offer 58 - II.左旋转字符串(简单)
- 26.删除排序数组中的重复项(简单)">26.删除排序数组中的重复项(简单)
- 剑指Offer 67.把字符串转换成整数(中等)经典atoi(),注意范围越界处理">剑指Offer 67.把字符串转换成整数(中等)经典atoi(),注意范围越界处理
- 找规律题
- 面试题01.08.零矩阵(简单)">面试题01.08.零矩阵(简单)
- 剑指Offer 61.扑克牌中的顺子 (中等)">剑指Offer 61.扑克牌中的顺子 (中等)
- 面试题16.11.跳水板(简单)">面试题16.11.跳水板(简单)
- 面试题01.05.一次编辑(中等)">面试题01.05.一次编辑(中等)
- 面试题16.15.珠玑妙算 (简单)">面试题16.15.珠玑妙算 (简单)
- 面试题16.04.井字游戏(中等)">面试题16.04.井字游戏(中等)
- 55.跳跃游戏 (中等)">55.跳跃游戏 (中等)
- 48.旋转图像 (中等)经典">48.旋转图像 (中等)经典
- 54.螺旋矩阵(中等)经典">54.螺旋矩阵(中等)经典
- 240.搜索二维矩阵II (中等)经典">240.搜索二维矩阵II (中等)经典
纯编程题
1.两数之和(简单)
1108. IP地址无效化(简单)
344.反转字符串(简单)
剑指 Offer 58 - I. 翻转单词顺序(简单)
125.验证回文串 (简单)
9.回文数(简单)
58.最后一个单词的长度(简单)
剑指Offer 05.替换空格(简单)
剑指Offer 58 - II.左旋转字符串(简单)
26.删除排序数组中的重复项(简单)
剑指Offer 67.把字符串转换成整数(中等)经典atoi(),注意范围越界处理
找规律题
面试题01.08.零矩阵(简单)
class Solution {public void setZeroes(int[][] matrix) {int x = matrix[0].length, y = matrix.length;boolean colExisted = false;for(int row = 0; row < y; row++) {if(matrix[row][0] == 0) {colExisted = true;}for(int col = 1; col < x; col++) {if(matrix[row][col] == 0) {matrix[row][0] = matrix[0][col] = 0;}}}for(int row = y - 1; row >= 0; row--) {for(int col = 1; col < x; col++) {if(matrix[row][0] == 0 || matrix[0][col] == 0) {matrix[row][col] = 0;}}if(colExisted) {matrix[row][0] = 0;}}}}
剑指Offer 61.扑克牌中的顺子 (中等)
排序+遍历
class Solution {public boolean isStraight(int[] nums) {// 先排序Arrays.sort(nums);int joker = 0;for(int i = 0; i < nums.length - 1; i++) {if(nums[i] == 0) {joker ++;continue;}// 相等直接返回 falseif(nums[i] == nums[i + 1]) {return false;}if(nums[i] + 1 != nums[i + 1]) {int diff = nums[i + 1] - nums[i] - 1;if(diff > joker) {return false;}joker -= diff;}}return true;}}
题解-优化
解题思路:
根据题意,此 5 张牌是顺子的 充分条件 如下:
- 除大小王外,所有牌 无重复 ;
- 设此 5 张牌中最大的牌为 max ,最小的牌为 min (大小王除外),则需满足:max - min < 5
因而,可将问题转化为:此 5 张牌是否满足以上两个条件?
作者:jyd
Set 集合 + 遍历
解题思路:
- 用 Set 集合判重
- max - min < 5
class Solution {public boolean isStraight(int[] nums) {Set<Integer> set = new HashSet<>();int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;for(int num : nums) {if(num == 0) {continue;}if(set.contains(num)) {return false;}set.add(num);min = Math.min(min, num);max = Math.max(max, num);}return max - min < 5;}}
排序+遍历
解题思路:
- 排序
- 排序完后遍历数组,nums[i] == nums[i + 1] 进行判重,记录 joker 牌的数量,那么最小值为 nums[joker],最大值为nums[n - 1]
class Solution {public boolean isStraight(int[] nums) {int joker = 0, n = nums.length;Arrays.sort(nums);for(int i = 0; i < n - 1; i++) {if(nums[i] == 0) {joker++;continue;}if(nums[i] == nums[i + 1]) {return false;}}return nums[n - 1] - nums[joker] < 5;}}
面试题16.11.跳水板(简单)
class Solution {public int[] divingBoard(int shorter, int longer, int k) {// 边界条件if(k == 0) {return new int[0];}if (shorter == longer) {return new int[]{shorter * k};}int[] res = new int[k+1];for(int i = 0; i <= k; i++) {res[i] = shorter * (k - i) + longer * i;}return res;}}
面试题01.05.一次编辑(中等)
class Solution {public boolean oneEditAway(String first, String second) {if((first.length() == 0 && second.length() == 0)|| (first.length() == 0 && second.length() == 1)|| (first.length() == 1 && second.length() == 0)) {return true;}int fl = first.length(), sl = second.length();int diff = Math.abs(fl - sl);// 两字符串长度相差不能超过1if(diff > 1) {return false;} else {// 不管是插入还是删除最终两字符串只会有一个字符不同int minLength = sl <= fl ? sl : fl, differentNums = 0;int fIdx = 0, sIdx = 0, idx = 0;while(fIdx < fl && sIdx < sl) {if(first.charAt(fIdx) != second.charAt(sIdx)) {differentNums++;if(sl > fl) {sIdx++;continue;}if(sl < fl) {fIdx++;continue;}}fIdx++;sIdx++;}return differentNums <= 1;}}}
面试题16.15.珠玑妙算 (简单)
class Solution {public int[] masterMind(String solution, String guess) {int fake = 0, real = 0;int[] map = new int[26];for(int i = 0; i < 4; i++){char sol = solution.charAt(i), gue = guess.charAt(i);if(sol == gue) real++;else{if(map[sol - 'A'] < 0) fake++;map[sol - 'A']++;if(map[gue - 'A'] > 0) fake++;map[gue - 'A']--;}}int[] ans = {real, fake};return ans;}}
面试题16.04.井字游戏(中等)
class Solution {public String tictactoe(String[] board) {int n = board.length;// 检查行for(int i = 0; i < n; i++) {int j = 0;for(; j < n - 1; j++) {if(board[i].charAt(j) == ' ' || board[i].charAt(j) != board[i].charAt(j + 1)) {break;}}if(j == n - 1) {return board[i].charAt(j) + "";}}// 检查列for(int i = 0; i < n; i++) {int j = 0;for(; j < n - 1; j++) {if(board[j].charAt(i) == ' ' || board[j].charAt(i) != board[j + 1].charAt(i)) {break;}}if(j == n - 1) {return board[j].charAt(i) + "";}}// 检查从左上到右下int i = 0, j = 0;while(i < n - 1 && j < n - 1) {if(board[i].charAt(j) == ' ' || board[i].charAt(j) != board[i + 1].charAt(j + 1)) {break;}i++;j++;}if(i == n - 1 && j == n - 1) {return board[i].charAt(j) + "";}i = n - 1;j = 0;// 检查从右上到左下while(i > 0 && j < n - 1) {if(board[i].charAt(j) == ' ' || board[i].charAt(j) != board[i - 1].charAt(j + 1)) {break;}i--;j++;}if(i == 0 && j == n - 1) {return board[i].charAt(j) + "";}for(int p = 0; p < n; p++) {for(int q = 0; q < n; q++) {if(board[p].charAt(q) == ' ') {return "Pending";}}}return "Draw";}}
55.跳跃游戏 (中等)
解题思路:
假设可达性 reachable = true,以最后一个元素的下标为目标值 targetIdx,往后遍历,判断后一个元素的值 + 该元素的下标值是否大于目标值 targetIdx。
如果小于,则 targetIdx 保持不变,reachable = false, 继续往后遍历。
反之,则 targetIdx 变为当前元素的下标值,reachable = true,继续往后遍历。
直至遍历完成。
class Solution {public boolean canJump(int[] nums) {// 倒序遍历排查boolean res = true;int n = nums.length;int targetIdx = n - 1;for(int i = n - 2; i >= 0; i--) {if(nums[i] + i < targetIdx) {res = false;} else {targetIdx = i;res = true;}}return res;}}
贪心-0
解题思路:
如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新 如果可以一直跳到最后,就成功了
作者:ikaruga
链接:https://leetcode-cn.com/problems/jump-game/solution/55-by-ikaruga/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {public boolean canJump(int[] nums) {int k = 0;for(int i = 0; i < nums.length; i++) {if(k < i) {return false;}k = Math.max(k, i + nums[i]);}return true;}}
贪心-优化写法
public class Solution {public boolean canJump(int[] nums) {int n = nums.length;int rightmost = 0;for (int i = 0; i < n; ++i) {if (i <= rightmost) {rightmost = Math.max(rightmost, i + nums[i]);if (rightmost >= n - 1) {return true;}}}return false;}}
48.旋转图像 (中等)经典
class Solution {public void rotate(int[][] matrix) {// 水平线翻转int s = 0, e = matrix.length - 1;while(s < e) {for(int i = 0; i < matrix.length; i++) {swap(s, i, e, i, matrix);}s++;e--;}// 以左上角到右下角的对角线为标准进行翻转int m = 0, n = 0;while(m < matrix.length) {for(int i = 0; i <= n; i++) {swap(m, i, i, m, matrix);}m++;n++;}}private void swap(int m1, int n1, int m2, int n2, int[][] matrix) {int temp = matrix[m1][n1];matrix[m1][n1] = matrix[m2][n2];matrix[m2][n2] = temp;}}
54.螺旋矩阵(中等)经典
class Solution {public List<Integer> spiralOrder(int[][] matrix) {int m = matrix.length, n = matrix[0].length;List<Integer> result = new ArrayList<>();int top = 0, bottom = m - 1, left = 0, right = n - 1;while(left <= right && top <= bottom) {// 左上到右上for(int i = left; i <= right; i++) {result.add(matrix[top][i]);}// 从右上到右下for(int i = top + 1; i <= bottom; i++) {result.add(matrix[i][right]);}// 右下到左下if(top != bottom) {for(int i = right - 1; i >= left; i--) {result.add(matrix[bottom][i]);}}if(left != right) {// 左下到右上for(int i = bottom - 1; i > top; i--) {result.add(matrix[i][left]);}}left++;right--;top++;bottom--;}return result;}}
240.搜索二维矩阵II (中等)经典
二分搜索
class Solution {public boolean searchMatrix(int[][] matrix, int target) {// 根据行来确定哪列boolean res = false;for(int[] nums : matrix) {res = binarySearch(nums, target);if(res){return res;}}return res;}// 标准二分写法private boolean binarySearch(int[] nums, int target) {int s = 0, e = nums.length - 1;while(s <= e) {int mid = (e + s) / 2;if(nums[mid] == target) {return true;} else if (target > nums[mid]) {s = mid + 1;} else {e = mid - 1;}}return false;}}
优化写法
解题思路:
- 从右上角的值开始倒推
由于行、列的数据都是升序的,那么当前值大于目标值时,从右上角出发,只能
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int hight = matrix.length, wide = matrix[0].length;int row = 0, col = wide - 1;while(row < hight && col >= 0) {if(matrix[row][col] == target) {return true;}if(matrix[row][col] > target) {col--;continue;}if(matrix[row][col] < target) {row++;continue;}}return false;}}

