算法
不吃辣。
这个作者很懒,什么都没留下…
展开
-
二十二:最小操作步骤数
题目假设s和m初始化, s = “a”; m = s;再定义两种操作, 第一种操作:m = s;s = s + s;第二种操作:s = s + m;求最小的操作步骤数, 可以将s拼接到长度等于n实现public class SplitNbySM { // 附加题:怎么判断一个数是不是质数? public static boolean isPrim(int n) { if (n < 2) { return false; } int max = (int) M原创 2020-07-03 09:09:34 · 355 阅读 · 0 评论 -
二十一:将正方形矩阵顺时针旋转90°
题目给定一个正方形矩阵, 只用有限几个变量, 实现矩阵中每个位置的数顺时针转动90度, 比如如下的矩阵0 1 2 34 5 6 78 9 10 1112 13 14 15矩阵应该被调整为:12 8 4 013 9 5 114 10 6 215 11 7 3实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in =原创 2020-06-08 15:38:54 · 301 阅读 · 1 评论 -
二十:顺时针打印矩阵
题目用螺旋的方式打印矩阵, 比如如下的矩阵0 1 2 34 5 6 78 9 10 11打印顺序为: 0 1 2 3 7 11 10 9 8 4 5 6实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt();原创 2020-06-08 14:36:39 · 118 阅读 · 0 评论 -
十九:“之”字形打印矩阵
题目用zigzag的方式打印矩阵, 比如如下的矩阵0 1 2 34 5 6 78 9 10 11打印顺序为: 0 1 4 8 5 2 3 6 9 10 7 11实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt();原创 2020-06-08 12:22:56 · 211 阅读 · 0 评论 -
十八:超级洗衣机
题目假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。给定一个非负整数数组代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。实现class Solution { public int findMinMoves(int[] m原创 2020-06-07 07:20:44 · 318 阅读 · 0 评论 -
十七:1出现最多的行
题目给定一个二维数组,只含有连续的0或连续的1,如果同时含有0和1,0肯定在1的左边,也可以一行中,全是0或者全是1,返回含有1数量最多的行实现原创 2020-06-07 06:39:05 · 179 阅读 · 0 评论 -
十六:在行列都排好序的矩阵中找指定数
题目给定一个元素为非负整数的二维数组matrix, 每行和每列都是从小到大有序的。再给定一个非负整数aim, 请判断aim是否在matrix中。实现import java.util.ArrayList;import java.util.List;import java.util.Scanner;import java.util.Stack;public class Main { public static boolean find(int[][] m, int k) { in原创 2020-06-06 23:12:53 · 238 阅读 · 0 评论 -
十五:二叉树根节点到叶节点权值最大和
题目二叉树每个结点都有一个int型权值, 给定一棵二叉树, 要求计算出从根结点到叶结点的所有路径中, 权值和最大的值为多少。实现package com.jpg.coding;public class MaxSum { public static class Node { public int value; public Node left; public Node right; public Node(int value) { this.value = val原创 2020-06-06 22:53:14 · 2126 阅读 · 0 评论 -
十四:数字字符串转换为字母组合的种数
题目将给定的数转换为字符串, 原则如下: 1对应 a, 2对应b, ……26对应z, 例如12258可以转换为"abbeh", “aveh”, “abyh”, “lbeh” and “lyh”, 个数为5, 编写一个函数, 给出可以转换的不同字符串的个数。实现package com.jpg.coding;public class NumToStringWays { public static int convertWays(int num) { if (num < 1) {原创 2020-06-06 21:59:52 · 1138 阅读 · 0 评论 -
十三:用一个栈实现另一个栈的排序
题目请编写一个程序, 对一个栈里的整型数据, 按升序进行排序(即排序前, 栈里的数据是无序的, 排序后最大元素位于栈顶) , 要求最多只能使用一个额外的栈存放临时数据, 但不得将元素复制到别的数据结构中。实现import java.util.Scanner;import java.util.Stack;public class Main { public static void test(Stack<Integer> stack) { Stack<Integer原创 2020-06-04 16:38:47 · 267 阅读 · 0 评论 -
十二:Magic操作
题目给一个包含n个整数元素的集合a, 一个包含m个整数元素的集合b。定义magic操作为, 从一个集合中取出一个元素, 放到另一个集合里, 且操作过后每个集合的平均值都大大于于操作前。注意以下两点:1) 不可以把一个集合的元素取空, 这样就没有平均值了2) 值为x的元素从集合b取出放入集合a, 但集合a中已经有值为x的元素, 则a的平均值不变(因为集合元素不会重复) , b的平均值可能会改变(因为x被取出了)问最多可以进行多少次magic操作?实现package com.jpg.c原创 2020-06-04 16:25:10 · 611 阅读 · 0 评论 -
十一:rand5到rand7及扩展
题目给定一个函数f, 可以1~5的数字等概率返回一个。 请加工出1~7的数字等概率返回一个的函数g。给定一个函数f, 可以a~b的数字等概率返回一个。 请加工出c~d的数字等概率返回一个的函数g。给定一个函数f, 以p概率返回0, 以1-p概率返回1。 请加工出等概率返回0和1的函数g实现package com.jpg.coding;public class Rand5ToRand7 { //已知的等概率返回1-5的函数 public static int f() { re原创 2020-06-04 15:26:29 · 236 阅读 · 0 评论 -
十:边界都是1的最大正方形大小
题目给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度、例如0 1 1 1 10 1 0 0 10 1 0 0 10 1 1 1 10 1 0 1 1其中,边框全是1的最大正方形的大小为4 \times 44×4,所以返回4[要求]时间复杂度为O(n^3)O(n3),空间复杂度为O(n^2)O(n2)实现import java.util.*;public class Main { public static原创 2020-06-04 12:06:08 · 271 阅读 · 0 评论 -
九:绳子覆盖的最大点数
题目给定一个有序数组arr, 代表数轴上从左到右有n个点arr[0]、 arr[1]…arr[n- 1],给定一个正数L, 代表一根长度为L的绳子, 求绳子最多能覆盖其中的几个点。实现package com.jpg.coding;public class CordCoverMaxPoint { //思路:让绳子的最右的端点依次压中数轴上的从左到右的点 //然后,根据绳子的长度和端点位置的差值value,通过在该点的左侧寻找大于等value最左的位置 //的点,然后通过下标变换就可以得原创 2020-06-04 11:14:50 · 825 阅读 · 0 评论 -
八:括号字符串最长有效长度
题目给定一个括号字符串str,返回最长的能够完全正确匹配括号字符字串的长度。实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String str = in.next(); System.out.println(maxLength(str)); }原创 2020-06-04 10:39:01 · 1028 阅读 · 0 评论 -
七:差值为k的去重数字对
题目给定一个数组arr, 求差值为k的去重数字对。实现package com.jpg.coding;import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.List;public class SubValueEqualK { public static List<List<Integer>> allPair(int[] arr,原创 2020-06-02 17:59:59 · 258 阅读 · 0 评论 -
六:括号匹配深度
题目一个合法的括号匹配序列有以下定义:1、空串"“是一个合法的括号匹配序列2、如果"X"和"Y"都是合法的括号匹配序列,“XY"也是一个合法的括号匹配序列3、如果"X"是一个合法的括号匹配序列,那么”(X)“也是一个合法的括号匹配序列4、每个合法的括号序列都可以由以上规则生成。例如: “”,”()”,"()()","((()))“都是合法的括号序列对于一个合法的括号序列我们又有以下定义它的深度:1、空串”“的深度是02、如果字符串"X"的深度是x,字符串"Y"的深度是y,那么字符串"XY原创 2020-06-02 17:18:49 · 376 阅读 · 0 评论 -
五:缺失的括号
题目一个完整的括号字符串定义规则如下:1、空字符串是完整的。2、如果s是完整的字符串,那么(s)也是完整的。3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。例如,"(()())", ““和”(())()“是完整的括号字符串,”())(”, “()(” 和 ")"是不完整的括号字符串。牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。实现import java.util.*;public c原创 2020-06-02 16:18:30 · 359 阅读 · 0 评论 -
四:二叉树结构种数
题目给定一个非负整数n, 代表二叉树的节点个数。 返回能形成多少种不同的二叉树结构实现package com.jpg.coding;public class NumTree { /* * 递归版本的写法: * 共有n个节点 * 左子树0个,右子树n - 1个 * 左子树1个,右子树n - 2个 * 左子树2个,右子树n - 3个 * ... */ public static int process(int n) { if (n < 0) { ret原创 2020-06-02 12:08:20 · 302 阅读 · 0 评论 -
三:红和绿
题目牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。如样例所示: s = RGRGR我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。实现import java.util.*; public class Main { public static vo原创 2020-06-02 06:21:55 · 270 阅读 · 1 评论 -
二:青草游戏
题目牛牛和羊羊都很喜欢青草。 今天他们决定玩青草游戏。最初有一个装有n份青草的箱子,牛牛和羊羊依次进行,牛牛先开始。 在每个回合中,每个玩家必须吃一些箱子中的青草,所吃的青草份数必须是4的x次幂,比如1,4,16,64等等。不能在箱子中吃到有效份数青草的玩家落败。 假定牛牛和羊羊都是按照最佳方法进行游戏,请输出胜利者的名字。实现package com.jpg.coding;public class Eat { public static String winner1(int n) {原创 2020-06-01 12:20:32 · 14142 阅读 · 0 评论 -
一:买苹果
题目小虎去附近的商店买苹果, 奸诈的商贩使用了捆绑交易, 只提供6个每袋和8个每袋的包装包装不可拆分。 可是小虎现在只想购买恰好n个苹果, 小虎想购买尽量少的袋数方便携带。 如果不能购买恰好n个苹果, 小虎将不会购买。 输入一个整数n, 表示小虎想购买的个苹果, 返回最小使用多少袋子。 如果无论如何都不能正好装下, 返回-1。实现package com.jpg.coding;/* * 因为只有8个类型和6个类型的袋子,所以只有当苹果的个数是偶数个的时候,才能将所有的苹果的都装下 * 如原创 2020-06-01 09:34:20 · 406 阅读 · 0 评论 -
190506打卡:将单向链表按某值划分成左边小,中间相等,右边大的形式
题目描述:给定一个单向链表的头结点head,节点的值类型是整型,再给定一个整数pivot。实现一个调整链表的函数,将链表调整为左边都是值小于pivot的节点,中间部分都是值大于pivot的节点,右部分都是值大于pivot的节点,还要求调整后的每部分的节点的顺序与原链表中的先后顺序一致。时间复杂度O(n),额外空间复杂度O(1)思路:将原链表中的所有节点依次划分为是三个链表,分别为small代...原创 2019-05-06 13:05:55 · 457 阅读 · 0 评论 -
190426打卡:打印两个有序链表的公共部分
题目描述:给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。思路:注意两个链表都是有序的,如果head1的值小于head2,head1向右移动(head1 = head1.next), 如果head1的值大于head2的值,则head2向右移动(head2 = head2.next),相等则打印输出public class Code_010_PrintCommonPar...原创 2019-04-26 13:37:13 · 123 阅读 · 0 评论 -
1905011打卡:递归和非递归方式实现二叉树的先中后序遍历
题目描述:用递归和非递归的方式,分别按照二叉树的先序,中序和后序打印所有节点,先序遍历顺序为根,左,右;中序遍历顺序为左,根,右;后序遍历为左,右,根import java.util.Stack;public class Code_023_PreInPosTraversal { public static class Node { public int data; publi...原创 2019-05-11 23:49:39 · 90 阅读 · 0 评论 -
190427打卡:反转部分单向链表
题目描述:给定一个单向链表的头结点head,以及两个整数from和to,在单向链表上把第from个节点到第to个节点这一部分进行反转例如:1->2->3->4->5->null, from = 2, to = 4调整结果为:1->4->3->2->5->null再如:1->2->3->null, from = ...原创 2019-04-27 18:41:25 · 290 阅读 · 0 评论 -
190423打卡:转圈打印矩阵
题目描述:转圈打印矩阵【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。例如:1 2 3 45 6 7 89 10 11 1213 14 15 16打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11, 10【要求】 额外空间复杂度为O(1)思路...原创 2019-04-23 11:42:48 · 140 阅读 · 0 评论 -
190423打卡:设计一个具有getMin功能的栈
题目描述:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。【要求】1.pop、push、getMin操作的时间复杂度都是O(1)。2.设计的栈类型可以使用现成的栈结构。思路:有两种方式的实现,都需要准备两个栈,一个stackData,一个stackMin,第一种方式是:在进行压栈操作时,如果栈为空,则分别将这个元素压入到这两个栈中,在以后进行压栈的操作中...原创 2019-04-23 11:33:04 · 78 阅读 · 0 评论 -
荷兰国旗问题
问题:给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。要求额外空间复杂度O(1),时间复杂度O(N)思路:从第一个数开始逐个与num比较如果小于num则和小于num区域的下一个位置的数交换,小于num区域扩大1,也就是less加一,cur也加1向后移动一个,指向下一个需要比较的数,如果大于num则将cu...原创 2019-02-17 22:47:59 · 355 阅读 · 0 评论 -
190426打卡:反转单向链表和双向链表
题目描述:【题目】 分别实现反转单向链表和反转双向链表的函数。【要求】 如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1)代码如下public class Code_011_ReverseList { public static class Node { public int data; public Node next; public Node(in...原创 2019-04-26 13:41:56 · 107 阅读 · 0 评论 -
190422打卡:队列实现栈
问题描述:如何仅用队列实现栈结构?思路:用两个队列实现栈,当入栈时,元素只进入data队列,当出栈时,将data队列的最后一个元素保留,然后将剩下的元素倒入到help队列中,然后将data队列中唯一一个元素出队,这样就达到了出栈的效果,然后将data栈和help栈交换,这样就可以保证下一次如果用户要求再次出栈就可以重复上述过程package code001_code010;import...原创 2019-04-22 14:40:12 · 120 阅读 · 0 评论 -
190422打卡:栈实现队列
问题描述:如何仅用栈实现队列?思路:用两个栈实现队列在队列入队的时候元素进入data栈,元素出队的时候,将data栈里面的元素倒入help栈中,然后依次从help栈里面弹出,在倒数据时有两个条件:1.如果要倒数据就一次性倒完,2.如果help栈中有元素则不能倒,只要满足该条件,就可以倒数据,并且倒数据可以发生在任何时刻package code001_code010;import ja...原创 2019-04-22 14:18:03 · 125 阅读 · 0 评论 -
190421打卡:有效括号匹配
题目描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入...原创 2019-04-21 20:16:47 · 106 阅读 · 0 评论 -
190425打卡:在单链表中删除指定值的节点
题目描述:删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5思路:有两种解题方式,一种是带虚拟头节点的单链表,另一种是不带虚拟节点的单链表public class Code_008_RemoveElementsInLinkedLis...原创 2019-04-25 20:03:50 · 457 阅读 · 0 评论 -
190427打卡:判断一个链表是否为回文结构
题目描述:给定一个链表的头结点head,判断该链表是否为回文结构。例如:1->2->1,返回false1-2->2->1,返回true15->6->15,返回true1->2->3,返回false要求:如果链表的长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)思路:设计两个指针,快指针一次走两步,慢指针一次走两步,然后从当...原创 2019-04-27 22:55:42 · 90 阅读 · 0 评论 -
190428打卡:复制含有随机指针节点的链表
题目描述:一种特殊的链表节点类描述如下:public class Node { public int data; public Node next; public Node random; public Node(int data) { this.data = data; } }Node类中的value是节点值,next指针和正常单链表中next指针的意义...原创 2019-04-28 14:38:20 · 70 阅读 · 0 评论 -
190510打卡:两个单链表相交的一系列问题
题目描述:在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数, 如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null 即可。 要求:如果链表1的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外空间复杂度请达到O(1)。思路:该问题比较复杂...原创 2019-05-10 23:39:34 · 112 阅读 · 0 评论 -
190507打卡:删除无序单链表中值重复出现的节点
题目描述:给定一个无序单链表的头结点head,删除其中值重复出现的节点。例如:1->2->3->3->4->4->2->1->1->null,删除值重复出现的节点后为:1->2->3->4->null。要求:额外空间复杂度为O(1)思路:类似于选择排序的过程,时间复杂度为O(n * n),额外空间复杂度为O(...原创 2019-05-07 13:40:57 · 479 阅读 · 1 评论 -
190509打卡:单链表的选择排序
题目描述:给定一个无序单链表的头节点head,实现单链表的选择排序。要求:额外空间复杂度为O(1)思路:找到最小的节点,从原始链表上摘下来,插入到新的链表中,有两种实现,大同小异public class Code_019_SelectionSort { public static class Node { public int data; public Node next;...原创 2019-05-09 18:17:08 · 85 阅读 · 0 评论 -
190508打卡:按照左右半区的方式重新组合单链表
题目描述:给定一个单链表的头部节点head,链表长度为N,如果N为偶数,那么前N/2个节点算zuobanqu左半区,后N/2算右半区;如果N为奇数,那么前N/2个节点算左半区,后N/2 + 1个节点算作右半区。左半区从左到右依次记为L1->L2->…,右半区从左到右依次记为R1->R2->…,请将单链表调整成L1->R1->L2->R2->…的形式...原创 2019-05-08 19:58:01 · 127 阅读 · 0 评论