算法面试题
三千大千世界
这个作者很懒,什么都没留下…
展开
-
无序数组,找到左侧元素比它小,后侧元素比它大的元素
// 无序数组,找到元素,它左边的元素都比它小,它右边的元素都比它大 @Test public void findEleTest() { int[] arr = new int[]{1,2,3,9,5,6,10,11,13,15,17}; findEle(arr); System.out.println(list); } public void findEle(int[] nums) { // 该数组存储元.原创 2021-08-02 19:39:01 · 537 阅读 · 0 评论 -
根据字符出现的次数排序
@Test public void sortStringTest() { System.out.println(sortString("2a554442f544asfasssffffasss")); System.out.println(sortStringWithBuket("Aabb")); System.out.println(sortStringWithBuket("2a554442f544asfasssffffasss"));// .原创 2021-07-09 18:12:38 · 509 阅读 · 0 评论 -
实现一个trie树,添加和搜索字符串
@Test public void searchWordTest() { List<String> words = new ArrayList<>(2); words.add("hello"); words.add("world"); TrieNode root = new TrieNode(); addWord(words, root); System.out.println(.原创 2021-07-09 10:39:11 · 111 阅读 · 0 评论 -
大数据排序
如一个4G的文件,里面是无重复的数字,要求在2G内存的机器上进行排序?方案1:linux sort 命令排序方案2:分治,归并。对大文件切割,分成4个500M的文件,然后就分别读入内存,进行快排,生成4个有序的新文件;然后变成合并K个有序数组/链表的问题,即对4个有序文件,每个读入100M的数据,然后使用一个500M的输出缓冲区;然后分别读入每个文件的第一个元素,判断取最小值,append到输出缓冲区,然后从取得最小值的文件的输入缓冲区,读下一个数字,再次比较,.原创 2021-06-24 09:37:27 · 225 阅读 · 0 评论 -
不同路径
leecode 66题@Test public void test() { System.out.println(uniquePaths(3,7)); System.out.println(uniquePaths(3,2)); System.out.println(uniquePaths(1,2)); } /* 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:35.3 MB,原创 2021-05-18 11:34:09 · 74 阅读 · 0 评论 -
使用最小花费爬楼梯
/*数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。示例1:输入:cost = [10, 15, 20]输出:15解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。示例 2:...原创 2021-05-13 13:03:16 · 63 阅读 · 0 评论 -
按摩师问题
/*一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输入: [2,7,9,3,1]输出: 12解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2.原创 2021-05-12 17:54:20 · 135 阅读 · 0 评论 -
顺时针打印二维数组
/*顺时针打印二维数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 4不走 先向右移动,对应的j++ 在向下移动,对应的i++ 在向左移动,对应的j-- 在向上移动,对应的i-- 下面的print可以去掉,提高执行效率*/public class PrintArray { .原创 2021-05-07 15:28:41 · 251 阅读 · 0 评论 -
三角形最小路径和
执行效率有待提高。。。。/* 给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。 示例 1: 输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]].原创 2021-04-30 14:46:10 · 133 阅读 · 0 评论 -
买卖股票的最佳时机
/** * * * 给定一个数组 prices ,它的第i 个元素prices[i] 表示一支给定股票第 i 天的价格。 * * 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 * * 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 * * * * 示例 1: * * ...原创 2021-04-29 21:26:21 · 136 阅读 · 0 评论 -
区域和检索 - 数组不可变
/** * 给定一个整数数组 nums,求出数组从索引i到j(i≤j)范围内元素的总和,包含i、j两点。 * * 实现 NumArray 类: * * NumArray(int[] nums) 使用数组 nums 初始化对象 * int sumRange(int i, int j) 返回数组 nums 从索引i到j(i≤j)范围内元素的总和,包含i、j两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j])) * *...原创 2021-04-29 21:18:03 · 138 阅读 · 0 评论 -
最大子序和
dp练习题:做出来了,但是执行很慢。。。。/** * 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] * 输出:6 * 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 * */ @Test public void test() { int[] nums = new int[]{-2,1,-3,4,-1,2,1,-5,4}; int s = maxSubArray(nu原创 2021-04-29 20:11:16 · 68 阅读 · 0 评论 -
找到第一个出现一次的字符,并返回
/** * 找到第一个出现一次的字符,并返回 * 如果没有,则返回空格 */ @Test public void test() { String s = "abaccdeff"; char ch = find(s); System.out.println(ch); } /** * 一个有序map,key是26个字符,value是次数,遍历一次字符串,统计各个字符的数量 ...原创 2021-04-16 17:27:27 · 128 阅读 · 0 评论 -
计算x的平方根
@Test public void test() { double res = sqrt(2, 0.00001); System.out.println(res); } /** * 求x的平方根 * 因为x的平方,这个函数是单调递增的,可以考虑使用二分法 * @param x * @param precision 精度 * @return */ private double ...原创 2021-04-13 11:24:54 · 213 阅读 · 0 评论 -
二维数组中查找目标数字
[ [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]]5/** * 利用从左到右递增,从上到下递增的特性 * 从左下角节点开始比较判断 * 如果target比它小,则上移一行 * 如果target比它大,则右移一列 * @param matrix * .原创 2021-04-08 17:08:57 · 130 阅读 · 0 评论 -
计算x的n次方
@Test public void test() { int x = 2, n = -10; boolean nagtive = false; if (n < 0) { n = -n; nagtive = true; } long res = pow(x, n); System.out.println(); if (nagtiv...原创 2021-04-07 13:53:28 · 200 阅读 · 0 评论 -
扑克牌顺子
/** * 扑克牌顺子 * 输入长度为5的数组,数字范围0-13, 0可以替代任意数字 * 判断数组元素是否连续 * * 思路: * 先排序,然后计算0的个数,同时记录数组上一个元素的值 * 当上一个元素+1不等于当前元素时,消耗0的数量,充当连续的数字 * 同时最外层循环-1,让下一次循环继续比较本次的值 * 如此往复 * @param input * @return */ .原创 2021-04-06 11:28:25 · 50 阅读 · 0 评论 -
从1累加到N
@Test public void plusN() { int sum = plusN(10); System.out.println(sum); sum = 0; // for循环验证结果 for (int i = 1; i <= 10; i++) { sum += i; } System.out.println(sum); }.原创 2021-04-02 16:19:49 · 949 阅读 · 0 评论 -
查找环形链表的入口连接点
/** * 查找链表的环的入口 * 即找到2的位置,若无环则返回null * 1-->2-->3 * ^ | * | | * 5<--4 */ @Test public void findRingEntry() { Node node = init(5); Node head = node; Node second = he.原创 2021-04-01 15:24:08 · 109 阅读 · 0 评论 -
重排单链表
如下单链表:1-->2-->3-->4-->5输出:1-->5-->2-->4-->3class Node{ int val; Node next; public Node(int val) { this.val = val; } } /** * 构造链表 * @param number * @ret.原创 2021-04-01 14:38:31 · 145 阅读 · 0 评论 -
反转单向链表
class Node{ int val; Node next; public Node(int val) { this.val = val; } } /** * 构造链表 * @param number * @return */ private Node init(int number) { Node node = new Node(1.原创 2021-04-01 14:12:35 · 51 阅读 · 0 评论 -
给你一个以行程长度编码压缩的整数列表 nums
/** * 给你一个以行程长度编码压缩的整数列表nums。 * * 考虑每对相邻的两个元素 [freq, val] = [nums[2*i], nums[2*i+1]](其中i >= 0),每一对都表示解压后子列表中有 freq个值为val的元素,你需要从左到右连接所有子列表以生成解压后的列表。 * * 请你返回解压后的列表。 * * * * 示例: * * 输入:nums = [1,2,3,4] * 输出:[2,4,4,4] * 解释:第一对 [1,2...原创 2020-05-11 20:54:03 · 339 阅读 · 0 评论 -
奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2...原创 2020-04-30 18:48:28 · 125 阅读 · 0 评论 -
输入一个数组,要求输出一个等长的新数组
当时到了晚上12点,还是没想出来。然后到了答题时间,窗口关闭。错失了一个机会啊。就这么错过了了。。。第二天早上上班路上,花了10分钟,想出了下面这个方案,整体是2次循环,应该也算O(n)把。/** * 输入一个数组,要求输出一个等长的新数组 * 新数组的下标元素的和等于旧数组除当前下标元素外所以元素的乘积 * 例如: * 输入: * [1,2,3,4] * 输出: * [2...原创 2020-04-30 10:02:19 · 248 阅读 · 0 评论 -
移除链表元素
删除链表中等于给定值val的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5通过次数73,762提交次数163,138来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-linked-li...原创 2020-04-28 19:03:49 · 111 阅读 · 0 评论 -
两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs著作权归...原创 2020-04-28 18:07:27 · 89 阅读 · 0 评论 -
合并区间
/** * 合并区间 * https://leetcode-cn.com/problems/merge-intervals/ * * 给出一个区间的集合,请合并所有重叠的区间。 * * 示例 1: * * 输入: [[1,3],[2,6],[8,10],[15,18]] * 输出: [[1,6],[8,10],[15,18]] * 解释: 区间 [1,3] 和 [2,6] 重...原创 2020-01-06 14:17:49 · 177 阅读 · 0 评论 -
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"w...原创 2019-12-25 21:13:36 · 154 阅读 · 0 评论 -
插入排序和希尔排序
/** * 插入排序系列 */public class InsertSort { public static void main(String[] args) { Random r = new Random(); int up = 100; int arrayLength = 11; int loops = 5; ...原创 2019-10-29 17:31:34 · 84 阅读 · 0 评论 -
2数求和
给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-number...原创 2019-10-22 16:21:52 · 168 阅读 · 0 评论 -
给定一个正整数,实现一个方法来求出离该整数最近的大于自身的“换位数”
算法题目:给定一个正整数,实现一个方法来求出离该整数最近的大于自身的“换位数”。什么是换位数呢?就是把一个整数各个数位的数字进行全排列,从而得到新的整数。例如53241和23541。小灰也不知道这种经过换位的整数应该如何称呼,所以姑且称其为“换位数”。题目要求写一个方法来寻找最近的且大于自身的换位数。比如下面这样:输入12345,返回12354输入12354,返回1243...原创 2019-09-04 16:44:10 · 481 阅读 · 0 评论 -
求2个有序数组的交集
利用合并排序的思想public void intersect2(int[] a, int[] b){if (a[0] > b[b.length - 1] || b[0] > a[a.length - 1]) { return; } int i = 0, j = 0;int lastA = Integer.MIN_VALUE, l原创 2015-07-06 17:32:57 · 692 阅读 · 0 评论 -
两个有序数组合并成一个有序数组
private int[] mergeSort(int[] first, int[] second){int[] result = new int[first.length + second.length];int i = 0, j = 0, r = 0;while (i if (first[i] result[r++] = first[i++];}else{resul原创 2015-07-05 14:43:22 · 513 阅读 · 0 评论