面试算法题
面试的编程题
真真最可爱
更新会很多的,适合新手刚入门的程序猿们看看。
展开
-
设计哈希映射
【代码】设计哈希映射。原创 2023-03-01 16:04:59 · 194 阅读 · 1 评论 -
最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。原创 2023-03-01 16:03:32 · 182 阅读 · 0 评论 -
找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。原创 2023-03-01 12:52:55 · 187 阅读 · 0 评论 -
在排序数组中查找元素的第一个和最后一个位置
/运用二分查找 class Solution {} //第一次查找 int first = firstPosition(nums , target);} //第二次查找 int last = lastPosition(nums , target);//这个一定要+1!!!!//这部分不一样,因为如果第一次知道了之后,中间值跟target相等,那么一定在右侧(左侧已经查完了) } else if(nums [ mid ] == target) {} }原创 2023-02-28 20:42:53 · 118 阅读 · 0 评论 -
最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。典型的二维动态规划...原创 2022-06-20 19:11:34 · 83 阅读 · 1 评论 -
接 雨 水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。暴力法(对于数组中的每个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。):双指针法(从上述方法的示意图中我们注意到,只要 rightmax>leftmax(元素 0 到元素 6),积水高度将由 leftmax 决定,类似地 leftmax>rightmax(元素 8 到元素 11)。所以我们可以认为如果一端有更高的条形块(例如右端),积水的高度依赖于当前方向的高度(原创 2022-06-19 20:45:26 · 87 阅读 · 0 评论 -
二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。原创 2022-06-17 18:45:01 · 70 阅读 · 1 评论 -
合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。用合并两个升序链表的方法(两两比较)用分治的方法进行比较(合并的次数确实是一样的,但是方法一随着比较,链表的长度会逐渐增加,再继续的话最坏的时间自然会更高。方法二能保证链表的长度没方法一长。)...原创 2022-06-16 15:11:53 · 147 阅读 · 0 评论 -
螺旋 矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。注意坐标原点在左上角!!!原创 2022-06-15 19:07:16 · 89 阅读 · 0 评论 -
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”递归法:(树的问题大部分可以用递归解决)搜索...原创 2022-06-13 15:20:36 · 70 阅读 · 0 评论 -
相交 链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。自定义评测:评测系统 的输入如下(你设计的程序 不适用 此输入):intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0listA - 第一个链表listB - 第二个链表skipA - 在 listA 中(从原创 2022-06-10 16:45:31 · 310 阅读 · 0 评论 -
搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0原创 2022-06-09 13:44:24 · 62 阅读 · 0 评论 -
买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。暴力法:一次遍历(找到最小值):...原创 2022-06-08 14:34:14 · 58 阅读 · 0 评论 -
二叉树中的最大路径和
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。...原创 2022-06-07 20:05:13 · 197 阅读 · 0 评论 -
重排 链表
合并时的视频分析:81a3dce2ef92af03a7666c5bb38d0f87原创 2022-06-06 18:27:10 · 120 阅读 · 0 评论 -
用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 i原创 2022-06-05 14:30:34 · 93 阅读 · 0 评论 -
删除排序链表中的重复元素 II
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。原创 2022-06-02 15:16:06 · 150 阅读 · 0 评论 -
反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left原创 2022-06-01 20:08:02 · 106 阅读 · 0 评论 -
环形链表 II(两种解法)
环形链表 II给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。哈希表法:/** * Definition for singly-li原创 2022-05-31 15:10:45 · 96 阅读 · 0 评论 -
合并两个有序数组
合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。最简单的直接排序(面试别用):原创 2022-05-30 14:10:05 · 321 阅读 · 0 评论 -
K 个一组翻转链表
K 个一组翻转链表给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。参考后面图片看代码,事半功倍!!/** * Definition for singly-linked list. * public class ListNode { * int val; * ListN原创 2022-05-27 19:58:26 · 149 阅读 · 0 评论 -
岛屿数量(dfs)
岛屿数量(dfs)给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。class Solution { public int numIslands(char[][] grid) { int m =grid.length; //定义行数 int n =grid[0].length; // 定义列数原创 2022-05-23 16:06:36 · 106 阅读 · 0 评论 -
全排列(力扣.46)
全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res =new ArrayList<>(); int len =nums.length; if(len==0){原创 2022-05-22 21:32:36 · 81 阅读 · 0 评论 -
二叉树的锯齿形层序遍历
二叉树的锯齿形层序遍历给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。其实跟二叉树的中序遍历差不多,就是加了个判断。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode()原创 2022-05-19 16:47:55 · 267 阅读 · 0 评论 -
二叉树的中序遍历
二叉树的中序遍历给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(in原创 2022-05-18 14:06:32 · 91 阅读 · 0 评论 -
比较版本号
比较版本号给你两个版本号 version1 和 version2 ,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订原创 2022-05-17 18:55:13 · 80 阅读 · 0 评论 -
删除链表的倒数第 N 个结点
删除链表的倒数第 N 个结点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。快慢指针:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, Li原创 2022-05-16 17:21:28 · 123 阅读 · 0 评论 -
寻找旋转排序数组中的最小值
寻找旋转排序数组中的最小值已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个元素值原创 2022-05-15 17:55:18 · 58 阅读 · 0 评论 -
最长回文子串
最长回文子串给你一个字符串 s,找到 s 中最长的回文子串。class Solution { public String longestPalindrome(String s) { if(s==null||s.length()<1){ return " "; } //中心扩散法、 int res= 0; //定义最终的长度 int start=0;//定义最后字符串的起始点原创 2022-05-14 14:25:34 · 78 阅读 · 0 评论 -
环形链表(两种解法)
环形链表给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true 。 否则,返回 false 。利用HashSet不能存储相同元素(可以存储null)/** * Definition for singly-l原创 2022-05-12 18:42:17 · 531 阅读 · 0 评论 -
最长递增子序列
最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。class Solution { public int lengthOfLIS(int[] nums) { int [] dp =new int [nums.length]; //定义动态规划数组长度为输入数组的长度 if(n原创 2022-05-11 19:49:07 · 87 阅读 · 0 评论 -
有效的括号
有效的括号给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合class Solution { public boolean isValid(String s) { if(s.length()%2==1){ return false; } //用栈(先进后出)来实现 Arr原创 2022-05-10 16:22:00 · 101 阅读 · 0 评论 -
爬楼梯——力扣70
爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?递归法:(时间太长)class Solution { public int climbStairs(int n) { if(n==1){ return 1; } if(n==2){ return 2; } //慢慢尝试找到规律,F(n)=F(原创 2022-05-10 13:41:28 · 91 阅读 · 0 评论 -
回文链表——
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。迭代法:时间太长/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNo原创 2022-05-09 14:21:14 · 244 阅读 · 0 评论 -
用 Rand7() 实现 Rand10()
用 Rand7() 实现 Rand10()给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。每个测试用例将有一个内部参数 n,即你实现的函数 rand10() 在测试时将被调用的次数。请注意,这不是传递给 rand10() 的参数。/** * The rand7() API is already defined i原创 2022-05-08 15:57:52 · 284 阅读 · 0 评论 -
力扣——两数之和
两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。暴力法class Solution { public int[] twoSum(int[] nums, int target) { int n = nums.length; for(int i =0原创 2022-05-07 17:11:11 · 57 阅读 · 0 评论 -
字符串转换整数 (atoi)
字符串转换整数 (atoi)请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数原创 2022-05-06 20:30:21 · 218 阅读 · 0 评论 -
无重复字符的最长子串
无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。class Solution { public int lengthOfLongestSubstring(String s) { if(s.length()<1){ //判断字符串长度是否小于1,小于1 就直接返回0 return s.length(); } int left =0; int righ原创 2022-05-05 14:43:54 · 176 阅读 · 0 评论 -
最大子数组和
最大子数组和给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。class Solution { public int maxSubArray(int[] nums) { // 用动态规划解题 int result =0 ; int all =0; int max =nums[0]; for(int i =0; i< nums.lengt原创 2022-05-04 18:19:23 · 233 阅读 · 0 评论 -
字符串相加
字符串相加给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。class Solution { public String addStrings(String num1, String num2) { StringBuilder result = new StringBuilder(""); in原创 2022-05-03 21:05:29 · 144 阅读 · 0 评论