算法
分享常规算法题目和解答。
HolyCode_
理论不懂就实践,实践不会就学理论!
天道酬勤,恒者能胜!
展开
-
删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head = [1,2,3,4,5], n = 2。下面贴一下官方解答,实际上可以使用快慢指针一次循环解决。输入:head = [1,2], n = 1。输入:head = [1], n = 1。进阶:你能尝试使用一趟扫描实现吗?输出:[1,2,3,5]链表中结点的数目为 sz。原创 2022-11-13 16:47:55 · 438 阅读 · 0 评论 -
按序打印
有三个线程会被异步启动。输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。输入:nums = [1,2,3]原创 2022-10-23 18:32:49 · 163 阅读 · 0 评论 -
电话号码的字母组合
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。digits[i] 是范围 [‘2’, ‘9’] 的一个数字。输入:digits = “23”输出:[“a”,“b”,“c”]输入:digits = “2”输入:digits = “”这里采用队列的方式处理。原创 2022-10-03 21:12:47 · 127 阅读 · 0 评论 -
最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。输入:nums = [-1,2,1,-4], target = 1。输入:nums = [0,0,0], target = 1。假定每组输入只存在恰好一个解。和求三数之和非常类似,双指针。原创 2022-10-03 19:24:41 · 107 阅读 · 0 评论 -
整数转罗马数字
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。例如, 罗马数字 2 写做 II ,即为两个并列的 1。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。解释: M = 1000, CM = 900, XC = 90, IV = 4.I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。解释: L = 50, V = 5, III = 3.转载 2022-09-03 00:18:56 · 159 阅读 · 0 评论 -
x 的平方根
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5。解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。给你一个非负整数 x ,计算并返回 x 的 算术平方根。...原创 2022-08-28 18:46:03 · 152 阅读 · 0 评论 -
四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0 ...原创 2022-07-12 01:00:53 · 237 阅读 · 0 评论 -
三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 ...转载 2022-07-10 12:16:20 · 115 阅读 · 0 评论 -
罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下原创 2022-07-10 11:14:22 · 536 阅读 · 0 评论 -
字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,“123” ->原创 2022-07-10 11:12:45 · 320 阅读 · 0 评论 -
加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。示例 2:输入:digits = [4,3,2,1]输出:[4,3,2,2]解释:输入数组表示数字 4321。示例 3:输入:digits = [0]输出:[1]提示:1 ...原创 2022-07-09 16:48:15 · 114 阅读 · 0 评论 -
Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入:s = “PAYPALISH原创 2022-07-09 12:09:57 · 130 阅读 · 0 评论 -
螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n = 1输出:[[1]]提示:1 ...原创 2022-07-09 00:54:18 · 115 阅读 · 0 评论 -
最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1:输入:s = “Hello World”输出:5解释:最后一个单词是“World”,长度为5。示例 2:输入:s = " fly me to the moon "输出:4解释:最后一个单词是“moon”,长度为4。示例 3:输入:s = “luffy is still joyboy”输出:6解释:最后一个单词是长原创 2022-07-09 00:29:28 · 139 阅读 · 0 评论 -
最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [5,4,-1,7,8]输出:23提示:1 ......原创 2022-07-08 00:41:57 · 1413 阅读 · 0 评论 -
盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输入:height = [1,1]输原创 2022-07-07 00:28:46 · 174 阅读 · 0 评论 -
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”提示:1原创 2022-07-03 23:30:02 · 114 阅读 · 0 评论 -
无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子原创 2022-07-03 19:16:46 · 647 阅读 · 0 评论 -
矩阵按照“之“字打印
题目对于一个矩阵,请设计一个算法,将元素按“之”字形打印。具体见样例。给定一个整数矩阵mat,以及他的维数nxm,请返回一个数组,其中元素依次为打印的数字。 测试样例: [[1,2,3],[4,5,6],[7,8,9],[10,11,12]],4,3 返回:[1,2,3,6,5,4,7,8,9,12,11,10]解答判断当前行数为奇为偶,为偶则正向输出当前行,为奇则反向输出当......原创 2018-04-14 15:45:07 · 112 阅读 · 0 评论 -
两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9原创 2022-07-03 12:14:09 · 106 阅读 · 0 评论 -
给一个词典,找出其中所有最长的单词。
题目描述 给一个词典,找出其中所有最长的单词。您在真实的面试中是否遇到过这个题? 样例 在词典{ “dog”, “google”, “facebook”, “internationalization”, “blabla” } 中, 最长的单词集合为 [“internationalization”]在词典{ “like”, “l...原创 2018-05-31 12:03:45 · 2358 阅读 · 0 评论 -
会议室问题
题目描述 给定一系列的会议时间间隔,包括起始和结束时间[[s1,e1],[s2,e2],…(si < ei),确定一个人是否可以参加所有会议。您在真实的面试中是否遇到过这个题? 样例 给定区间=[[0,30],[5,10],[15,20]],返回false。解答public class MeetingRooms2 { public static void ...原创 2018-05-29 18:04:06 · 1200 阅读 · 0 评论 -
单例模式
题目描述 单例 是最为最常见的设计模式之一。对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例。例如,对于 class Mouse (不是动物的mouse哦),我们应将其设计为 singleton 模式。你的任务是设计一个 getInstance 方法,对于给定的类,每次调用 getInstance 时,都可得到同一个实例。样例 在 Java 中:...原创 2018-05-31 11:41:32 · 320 阅读 · 0 评论 -
相反的顺序存储
题目相反的顺序存储 给出一个链表,并将链表的值以in reverse order存储到数组中。样例 给定1 -> 2 -> 3 -> null,返回[3,2,1]。解答public class FanZhuanList { /** * @param head: the given linked list * @return:...原创 2018-05-25 21:37:44 · 469 阅读 · 0 评论 -
查找斐波纳契数列中第 N 个数
题目查找斐波纳契数列中第 N 个数。所谓的斐波纳契数列是指:前2个数是 0 和 1 。 第 i 个数是第 i-1 个数和第i-2 个数的和。 斐波纳契数列的前10个数字是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34 …解法public class Fibonacci { public static void main(String[...原创 2018-05-22 11:32:53 · 523 阅读 · 0 评论 -
在二叉树中寻找值最大的节点并返回
题目二叉树的最大节点 在二叉树中寻找值最大的节点并返回。样例 给出如下一棵二叉树:1 / \ -5 2 / \ / \ 0 3 -4 -5 返回值为 3 的节点。解答public class FindMaxNumInTree { public static void main(String[] args) { ...原创 2018-05-23 21:19:41 · 4378 阅读 · 0 评论 -
查找子字符串的位置
题目查找子字符串的位置解答public class FindStr { public static void main(String[] args) { System.out.println(strStr("source", "target")); } public static int strStr(String source, Stri...原创 2018-05-23 21:22:45 · 1151 阅读 · 0 评论 -
最小堆实现
题目最小堆实现解答public class MinHeap { public static void main(String[] args) { int[] test = {23,42,5,1,56}; heapify(test); print(0,test); } public static voi...原创 2018-05-23 21:26:25 · 299 阅读 · 0 评论 -
逆时针输出矩阵
题目逆时针输出矩阵解答public class NishizhenPrintJuzhen { public static int[][] getPrint(int n ){ int[][] result = new int[n][n]; int current = 0; //cycle为总循环...原创 2018-05-23 21:32:14 · 1951 阅读 · 0 评论 -
给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法
题目描述 给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。您在真实的面试中是否遇到过这个题? 样例 对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]。public class SortNums { public static void main(String[] args) { ...原创 2018-05-23 21:33:25 · 1874 阅读 · 0 评论 -
矩阵顺时针旋转90度
题目矩阵顺时针旋转90度解答public class TransFerJuzhen { // 规律:新坐标(i,j) = 老坐标(n-j-1,i) public static int[][] transfer(int[][] origin, int n) { int[][] transferResult = new int[n][n]; ...原创 2018-05-23 21:34:54 · 6840 阅读 · 0 评论 -
反转一个只有3位数的整数
题目反转一个只有3位数的整数。你可以假设输入一定是一个只有三位数的整数,这个整数大于等于100,小于1000。 样例 123 反转之后是 321。 900 反转之后是 9。解答public class TransferNums { public static void main(String[] args) { System.out.prin...原创 2018-05-23 21:35:45 · 2823 阅读 · 0 评论 -
求权重矩阵最短路径
题目给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。 例子: 给定m如下: 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12。解答思路:使用动态规划,定义 dp[M][N] , M ...原创 2018-05-18 14:09:46 · 1724 阅读 · 0 评论 -
顺时针输出矩阵
题目给一个矩阵,将矩阵顺时针打印出来,如: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7解答主要是找规律,最大循环圈数为cycle= n/2 , 然后分别看上下左右 第一圈和第二圈的行走路径规律就行了,注意最后退出的条件可以是判断当前的点有没有设置非0值。public class NishizhenPr...原创 2018-05-18 14:03:39 · 640 阅读 · 0 评论 -
矩阵按照之字打印
题目对于一个矩阵,请设计一个算法,将元素按“之”字形打印。具体见样例。给定一个整数矩阵mat,以及他的维数nxm,请返回一个数组,其中元素依次为打印的数字。 测试样例: [[1,2,3],[4,5,6],[7,8,9],[10,11,12]],4,3 返回:[1,2,3,6,5,4,7,8,9,12,11,10]解答判断当前行数为奇为偶,为偶则正向输出当前行,为奇则反向输出当前行...原创 2018-05-18 14:04:57 · 506 阅读 · 0 评论 -
这几天笔试常考算法
1.求两个数公约数public class Gongyue { public static void main(String args[]){ int max = getMaxGongyue(11,12); System.out.println(max); } public static int getMaxGongyue(int a,原创 2015-09-24 16:05:04 · 688 阅读 · 0 评论 -
快速排序
经典算法,快速排序:/** * 快速排序 * * @author yunmo.hl * @version $Id: QuickSort.java, v 0.1 2018年04月14日 16:19 yunmo.hl Exp $ */public class QuickSort { public static int subSort(int[] origin, int ...原创 2018-04-29 10:29:52 · 223 阅读 · 0 评论 -
求区间段覆盖总长度
问题现有一直线,从原点到无穷大。 这条直线上有N个线段。线段可能相交。 问,N个线段总共覆盖了多长?(重复覆盖的地区只计算一次)解答用一个数组来标记区间段的覆盖情况,最后遍历这个标记数组就行了。public class XianDuanLength { public static void main(String[] args) { SegMe...原创 2018-04-29 10:29:03 · 1932 阅读 · 0 评论