前端面试算法
C.&H.
这个作者很懒,什么都没留下…
展开
-
47、删除链表中倒数第k个结点
一、题目二、实现注意:1. 删除该结点,还需找到该节点的前一个结点2. 删除的结点,可能是链表中的第一个结点import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { /** * * @param head ListNode类 * @param n原创 2021-05-10 07:11:36 · 266 阅读 · 0 评论 -
46、括号匹配
import java.util.*;public class Solution { /** * * @param s string字符串 * @return bool布尔型 */ public boolean isValid (String s) { char str[] = s.toCharArray(); Stack<Character> stack = new Stack(); ...原创 2021-05-10 07:11:24 · 87 阅读 · 0 评论 -
45、最小的k个数
一、题目给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组二、实现import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayLis原创 2021-05-10 06:37:21 · 115 阅读 · 0 评论 -
44、最长公共子串
一、题目给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。二、实现(动态规划)以"helloworld"和“loop”为例当s1[i] != s2[j]时,dp[i][j]就直接等于0了,因为子串必须连续,且dp[i][j] 表示的是以s1[i],s2[j]截尾的公共子串的长度import java.util.*;public class Solution { /** * longe原创 2021-05-10 07:11:09 · 161 阅读 · 0 评论 -
43、判断链表中是否有环
一、题目二、实现思路:使用快慢指针我们可以这样来思考一下,假如有环,那么快慢指针最终都会走到环上,假如环的长度是m,快慢指针最近的间距是n,如下图中所示快指针每次走两步,慢指针每次走一步,所以每走一次快慢指针的间距就要缩小一步,在图一中当走n次的时候就会相遇,在图二中当走m-n次的时候就会相遇。/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode原创 2021-05-10 07:10:57 · 72 阅读 · 0 评论 -
42、链表中的节点每k个一组翻转
一、题目二、实现import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { /** * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ public原创 2021-05-10 07:10:42 · 108 阅读 · 0 评论 -
41、二叉树的层次遍历
import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** * * @param root TreeNode类 * @return int整型ArrayList<ArrayList<>...原创 2021-05-09 07:32:01 · 95 阅读 · 0 评论 -
40、分别按照二叉树先序,中序和后序打印所有的节点。
import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** * * @param root TreeNode类 the root of binary tree * @return int整型二维数组 ...原创 2021-05-09 07:31:49 · 203 阅读 · 0 评论 -
39、设计LRU缓存结构
一、题目设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x, y,表示set(x, y)若opt=2,接下来一个整原创 2021-05-09 07:31:38 · 151 阅读 · 0 评论 -
38、给定一个数组,请你编写一个函数,返回该数组排序后的形式。
import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here ...原创 2021-05-09 07:31:28 · 1171 阅读 · 0 评论 -
37、反转链表
一、题目输入一个链表,反转链表后,输出新链表的表头。二、实现/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head) { if(head==n.原创 2021-05-09 07:31:18 · 133 阅读 · 0 评论 -
36、给定一个无重复数字的数组,求其全排列
一、题目给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。二、实现class Solution { public List<List<Integer>> permute(int[] nums) { // 1.结果集 List<List<Integer>> res = new ArrayList<>(); // 2. 定...原创 2021-05-09 07:31:07 · 1998 阅读 · 0 评论 -
35、两个栈实现队列
import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { // 不用考虑栈满的情况 stack1.push(nod.原创 2021-05-09 07:30:59 · 92 阅读 · 0 评论 -
34、n个节点的二叉树有多少种形态
一、问题输出n个节点的二叉树有多少种形态或 二、实现import java.util.HashMap;public class Test{ public static void main(String args[]) { int n = 4; int res = getRootNum(n); System.out.println(res); } // 获取n个节点的二叉树 有多少种形态 private static int getRootNum(in..原创 2021-05-09 07:30:46 · 640 阅读 · 0 评论 -
33、最长无重复子串
一、题目给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。 二、实现使用双指针我们使用两个指针,一个i一个j,最开始的时候i和j指向第一个元素,然后i往后移,把扫描过的元素都放到map中,如果i扫描过的元素没有重复的就一直往后移,顺便记录一下最大值max,如果i扫描过的元素有重复的,就改变j的位置,我们就以pwwkew(这是之前画的图,求的是字符串,不是数字,这里就拿来用了,原理都是一样的)为例画个图看一下注意:map集合中...原创 2021-05-09 07:30:35 · 155 阅读 · 0 评论 -
32、给出一组区间,请合并所有重叠的区间
一、题目给出一组区间,请合并所有重叠的区间。请保证合并后的区间按区间起点升序排列二、实现对左边界排序,如果下一个区间的左边界在前一个的有边界内,考虑是否要更新边界,如果如果下一个区间的左边界在前一个的有边界外,说明区间无法合并,开始计算下一个区间首先我们来考虑一个问题:什么样的两个区间可以合并?像上图这样,起点大的那个区间([13,16])的起点在另一个区间的范围之内,这样两个区间就可以进行合并了所以我们把全部的区间按起点进行排序,然后看一下第i个区间能不能和i-1个区间原创 2021-05-08 09:06:24 · 2830 阅读 · 0 评论 -
31、利用快速排序,寻找数组中第k大的数
一、题目有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。二、实现注意:寻找第k大的数,需使用快速排序对数组进行递减排序import java.util.*;public class Solution { public int findKth(int[] a, int n, int K) { return findK(a,0,n-1,K);原创 2021-05-08 08:37:26 · 633 阅读 · 0 评论 -
30、二叉树之Z形层序遍历
一、题目给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定的二叉树是{3,9,20,#,#,15,7},二、实现import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution {原创 2021-05-08 07:56:35 · 723 阅读 · 0 评论 -
29、二分查找(有重复数字,返回第一次出现的位置)
一、题目请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1二、实现注意:题目要求从左到右,返回第一个为target的下标。与普通的二分查找不同主要在于:import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直.原创 2021-05-08 07:06:30 · 1478 阅读 · 0 评论 -
28、实现快速排序
public class Test{ public static void main(String args[]) { int a[] = {1,1,3,6,2,9,10}; Quick(a,0,a.length-1); //对数组a进行快速排序 for(int i=0;i<a.length;i++) { System.out.println(a[i]); } } public static void Quick(int a[], int low, int.原创 2021-05-08 06:31:22 · 91 阅读 · 0 评论 -
27、输出二叉树每一层最右的节点(即二叉树右视图)
一、题目给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入:[1,2,3,null,5,null,4]输出:[1, 3, 4]解释: 1 <---/ \2 3 <---\ \ 5 4 <---二、实现思路: 利用 BFS 进行层次遍历,记录下每层的最后一个元素。时间复杂度: O(N)O(N),每个节点都入队出队了...原创 2021-05-08 06:31:12 · 1761 阅读 · 0 评论 -
26. 跨台阶(每次可跨1...n阶)
一、题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。二、实现f(n) 表示跳一个n级台阶的总跳法f[n] = f[n-1] + f[n-2] + ... + f[0]f[n-1] = f[n-2] + f[n-3] + ... + f[0]所以一合并,f[n] = 2*f[n-1],初始条件f[0] = f[1] = 1public class Solution { public int jumpF.原创 2021-05-08 06:31:02 · 564 阅读 · 0 评论 -
25、跨台阶(每次可跨1或2阶;升级版:不能连续两次跨2阶)
一、问题一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21二、实现使用动态规划,如果直接使用斐波那契复杂度高class Solution { public int numWays(int n) { if(n==0 ||.原创 2021-05-08 06:30:50 · 1257 阅读 · 0 评论 -
24. 二进制数相加,返回二进制数
一、题目给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字1和0。示例1:输入: a = "11", b = "1"输出: "100"示例2:输入: a = "1010", b = "1011"输出: "10101"二、实现从低位开始相加class Solution { public String addBinary(String a, String b) { // 从a和b的最低位开始相加,...原创 2021-05-08 06:30:40 · 363 阅读 · 0 评论 -
23. 圆圈中最后剩下的数字
一、题目0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出:3示例 2:输入: n = 10, m = 17输出:2限制:1 <= n<= 10^51 <...原创 2021-05-08 06:30:25 · 135 阅读 · 0 评论 -
22. 二叉树最大宽度
一、题目给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:输入: 1 / \ 3 2 / \ \ 5 3 9输出: 4解释: 最大值出现在树...原创 2021-05-07 20:48:41 · 1604 阅读 · 2 评论 -
21. 寻找两个链表的第一个公共节点
一、题目输入两个链表,找出它们的第一个公共节点。二、实现对于A和B两个链表(长度分别为lenA和lenB,公共长度为lenAB),a和b分别指向链表A和B的第一个结点a先遍历链表A,然后再遍历链表B,直到与b相遇 (遍历的长度:A的长度lenA + 与b相遇前已遍历的链表B的长度lenB-lenAB)b先遍历链表B,然后再遍历链表A,直到与a相遇 (遍历的长度:B的长度lenB + 与a相遇前已遍历的链表A的长度lenA-lenAB)即a和b都遍历了链表A和B的结点a和b相.原创 2021-05-07 20:16:01 · 268 阅读 · 0 评论 -
20. 合并两个有序的数组
一、题目给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化A 和 B 的元素数量分别为m 和 n。二、实现原创 2021-05-07 19:34:34 · 117 阅读 · 0 评论 -
19. 合并两个有序的链表
一、题目二、实现/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { Li原创 2021-05-07 19:32:43 · 84 阅读 · 0 评论 -
18. 链表中倒数第k个节点
一、题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。二、实现/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *原创 2021-05-07 19:18:23 · 77 阅读 · 0 评论 -
17. 岛屿的最大面积
一、题目给定一个包含了一些 0 和 1 的非空二维数组grid 。一个岛屿是由一些相邻的1(代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)二、实现每次深度遍历时,记录当前岛屿的面积,保留最大的面积class Solution { public int maxAreaOfIsland(int[][...原创 2021-05-07 19:04:46 · 111 阅读 · 0 评论 -
16. 岛屿数量
一、题目给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。二、实现import java.util.Scanner;public class Test{ public static void main(String args[]) { Scanner sc = new Scanner(System.in);.原创 2021-05-07 18:56:49 · 78 阅读 · 0 评论 -
15. 二叉树中和为某一值的路径
一、题目输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。二、实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int原创 2021-05-07 18:33:20 · 247 阅读 · 0 评论 -
14. 找数组中最长递增子序列
一、题目二、实现(动态规划)将数组中的每一个元素依次作为结尾元素,遍历该结尾元素前的所有元素,查找比结尾元素小的元素,如果小则递增子序列的长度加1(长度初始为1,其本身)import java.util.Scanner;public class Test{ public static void main(String args[]) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int a[] =原创 2021-05-07 18:03:33 · 544 阅读 · 0 评论 -
13. 字节跳动2018校招前端方向----[编程题]手串
一、题目作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串——每个串珠要么无色,要么涂了若干种颜色。为了使手串的色彩看起来不那么单调,金主要求,手串上的任意一种颜色(不包含无色),在任意连续的m个串珠里至多出现一次(注意这里手串是一个环形)。手串上的颜色一共有c种。现在按顺时针序告诉你n个串珠的手串上,每个串珠用所包含的颜色分别有哪些。请你判断该手串上有多少种颜色不符合要求。即询问有多少种颜色在任意连续m个串珠中出现了至少两次。共有5个串珠,在任意连续的2个串珠中每种颜色至多出现一原创 2021-05-07 13:19:21 · 192 阅读 · 0 评论 -
12. 岛屿的最大面积
一、问题给定一个包含了一些 0 和 1 的非空二维数组grid 。一个岛屿是由一些相邻的1(代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积(数字1最多的岛屿)。(如果没有岛屿,则返回面积为 0 。)二、思路使用深度优先遍历:如果当前位置是1,寻找其上下左右的1,将这些1置为0(避免重复计数),岛屿数量加1三、实现import ja...原创 2021-04-19 16:58:11 · 247 阅读 · 0 评论 -
11. 最大子序和
一、题目给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。进阶:如果你已经实现复杂度为O(n)的解法,尝试使用更为精妙的分治法求解。二、思路使用动态规划求解三、实现import java.util.Scanner;public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in);...原创 2021-04-19 13:57:59 · 87 阅读 · 0 评论 -
10.翻转二叉树
一、题目二、思路递归的交换每个结点的左右孩子三、实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int .原创 2021-04-19 13:23:42 · 53 阅读 · 0 评论 -
9.字符串相加
一、题目二、思路三、实现import java.util.Scanner;public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); String num1 = sc.next(); String num2 = sc.next(); String res = stringAdd(num1,num2); System.out原创 2021-04-19 13:11:54 · 135 阅读 · 0 评论 -
8.无重复字符的最长字串
一、题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。二、思路长度为 N 的字符串共有((N+1)N)/2个子字符串(复杂度为O(N^2))判断长度为 NN 的字符串是否有重复字符的复杂度为 O(N) ,因此本题使用暴力法解决的复杂度为 O(N^3)。方法一:使用滑动窗口和HashMap集合三、实现import java.util.HashMap;import java.util.Scanner;public class Main ..原创 2021-04-17 15:19:20 · 141 阅读 · 0 评论