算法
HE N
这个作者很懒,什么都没留下…
展开
-
两个链表的第一个公共节点
题目:输入两个链表,找出它们的第一个公共节点。方法一:分别把两个链表的节点放入两个栈里,这样两个链表的尾节点就位于两个栈的栈顶,接下来比较两个战顶的节点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的节点。{ if(pHead1==null||pHead2==null){ return null; } ...原创 2019-08-13 17:44:42 · 79 阅读 · 0 评论 -
平衡二叉树
题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。平衡二叉树是指以当前节点为根节点的树,左右子树的深度不得超过1.方法一:意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。计算树的深度,树的深度=max(左子树深度,右子树深度)+1。在遍历过程中,判断左右子树深度相差是否超过1,如果不平衡,则令树的深度=-1,用来表示树不平衡。最终根据树的深度是否等于-1来确定是否...原创 2019-08-14 19:57:46 · 206 阅读 · 0 评论 -
礼物的最大值
题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?动态规划:定义f(i,j)为到达(i,j)位置格子时能拿到的礼物总和的最大值,则有:f(i,j)=max{f(i,j),f(i,j)}+values(i,j...原创 2019-08-10 16:26:49 · 308 阅读 · 0 评论 -
数组中数字出现的次数
题目:数组中只出现一次的两个数字。一个整数型数组里除了两个数字之外,其他数字都出现了两次,请找出这两个只出现一次的数字,要求时间复杂度O(n),空间复杂度O(1).我们想到异或运算的一个性质:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。把原数组分成两个子数姐...原创 2019-08-15 09:47:18 · 564 阅读 · 0 评论 -
数组中唯一只出现一次的数
题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。这道题中数字出现了三次,无法像数组中只出现一次的两个数字一样通过利用异或位运算进行消除相同个数字。但是仍然可以沿用位运算的思路。将所有数字的二进制表示的对应位都加起来,如果某一位能被三整除,那么只出现一次的数字在该位为0;反之,为1。一个int型有32位,每一位不是0就是1。对于三个相同的数,...原创 2019-08-15 14:28:47 · 454 阅读 · 0 评论 -
和为s的数
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。从头开始遍历数字,确定一个数字后,对后面的数字遍历,判断和是否为s,这种方法复杂度为O(n^2),效率太低。 我们考虑到,如果一个数字比较小,那么另一个数字一定比较大,同时数字为递增排列;所以,我们设置两个指针,一个指针small从第一个数字(最小)出发,另一个指针...原创 2019-08-15 14:58:12 · 175 阅读 · 0 评论 -
和为s的连续正数序列
题目:输入一个正数S,打印出所有和为S的连续正数序列(至少含有两个数)。例如,输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出3个连续序列1,2,3,4,5,4,5,6和7,8。首先把small初始化为1,big初始化为2。如果从smal1到big的序列的和大于S,则可以从序列中去掉较小的值,也就是增大small的值。如果从sma1l到big的序列的和小于S,则...原创 2019-08-15 16:46:48 · 155 阅读 · 0 评论 -
翻转字符串
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。思路一开始自己觉得要用split()方法,但这要开辟新的数组,占内存空间,不行。 *首先实现翻转整个句子:只需要在首尾两端各放置一个指针,交换指针所指的数字,两端指针往中间移动即可。之...原创 2019-08-15 19:11:32 · 104 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含‘a’~‘z’的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是”acfr”,长度为 4。分析:f(i)表示第i个字符为结尾的不包含重复字符的子字符串的最大长度。如果第i个字符之前没有出现过,那么f(i)=f(i-1)+1。例如,在字符串"arabcaf...原创 2019-08-12 09:44:51 · 336 阅读 · 0 评论 -
丑数
题目:我们把只包含因子2、3和5的数称作丑数 (UglyNumber)。求按从小到大的顺序找到第1500个丑数是多少?• 例如,6、8 都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第一个丑数。• 解法1:逐个判断每个整数是不是丑数的解法,直观但不够高效。package helen.b;public class UglyNumber { public stati...原创 2019-08-12 11:16:12 · 191 阅读 · 0 评论 -
把数字翻译成字符串
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",……,11翻译成"l",……,25翻译成"z"。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是"bccfi"、“bwfi”、“bczi”、"mcfi"和“mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。如果自下而上,从小的结果出发,保存每一步计算的结果,以供下一步使用...原创 2019-08-10 12:25:18 · 362 阅读 · 0 评论 -
二叉树的深度
题目:输入一棵二叉树的根结点,求该树的深度。分析:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。树的深度=max(左子树深度,右子树深度)+1,采用递归实现。package helen.c;public class TreeDeep { public class TreeNode{ int val; ...原创 2019-08-14 16:28:37 · 330 阅读 · 0 评论 -
把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。不好的方法:求出所有全排列(类似字符串的排列 ),将数字拼起来,最后求出所有的最小值。这效率太低,且没有考虑到大数问题。好的方法:观察规律,自行定义一种排序规则。对于数字m和n,可以拼接成mn和nm,如果m...原创 2019-08-10 10:46:26 · 107 阅读 · 0 评论 -
在排序数组中查找数字
题目一:数字在排序数组中出现的次数。统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。设计一个改进的二分查找法,分别查找数组中第一个该数字和最后一个该数字,找到之后;利用索引计算中间该数字的个数;package helen.c;public class ArrayFind { voi...原创 2019-08-13 18:57:19 · 385 阅读 · 0 评论 -
字符串的排列
题目:输入一个字符串,【每个字符不同】,打印出该字符串中字符的所有排列。分析,我们把一个字符串看成两个部分,第一部分是它的第一个字符,第二个部分是后面的所有字符,拿第一个字符和他后面的字符逐个交换。解决方法:递归第一步,求所有可能出现在第一个位置的字符,即把第一个字符和后面的左右字符交换。第二步,固定第一个字符,求后面的所有排列。这时候我们仍把后面的所有字符分成两部分,后面字符的第一个字符...原创 2019-08-07 10:46:13 · 107 阅读 · 0 评论 -
连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为0(n).{1,-2,3,10,-4,7,2,-1}初始化数组中的每个数字,从第一个数字开始累加,如果开始时累加的结果小于0;从后面开始截取。累加并持续更新最大数组和package helen.b;public class MaxSum { pub...原创 2019-08-09 11:27:01 · 99 阅读 · 0 评论 -
1~n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。思路如果是从头到尾遍历(n次),对每一个数字都计算其1的个数(lgn次),则时间复杂度为O(nlogn),运算效率太低。因此必须总结规律,提高效率。总结规律如下(思路比《剑指OFFER》一书简单):对于整数n,我们将这个整数分为三...原创 2019-08-09 14:39:25 · 326 阅读 · 0 评论 -
数字序列中的某一列数字
题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。 * 请写一个函数,求任意第n位对应的数字。思路:从数字本身的规律入手。如果要找第1001位,肯定不会考虑0-9十位吧?接下来10-99也就有180位而已,不考虑,每次不考虑的情况需要减去已缩小查找范围,因此在排除掉0-99共18...原创 2019-08-09 16:05:05 · 180 阅读 · 0 评论 -
0~n-1中缺失的数字
题目:一个长度为n-1的递增数组中所有的数字都是唯一的,并且每个数字都在范围0~n-1之内,在范围内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。第一个方法先遍历,求出所有数据的和,再利用公式,找出缺失的数据的值。第二个方法,利用二分查找,找出缺失的数字。package helen.c;public class MissingNumber { public stati...原创 2019-08-14 10:03:10 · 180 阅读 · 0 评论 -
数组中数值和下标相等的元素
假设一个单调递增的数组里每个元素都是整数,并且是唯一的,请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。因为元素是单调递增的,所以用改进的二分查找法就可以。package helen.c;public class FindNum { public static int getNumberSameAsIndex(int[] num){ //找出数组中任...原创 2019-08-14 11:14:16 · 250 阅读 · 0 评论 -
数组中出现超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路一:数字次数超过一半,则说明:排序之后数组中间的数字一定就是所求的数字。利用partition()函数获得某一随机数字,其余数字按大小排在该数字的左右。若该数字下标刚好为n/2,...原创 2019-08-07 17:35:51 · 207 阅读 · 0 评论 -
二叉搜索树的第K大节点
题目:给定一颗二叉搜索树,请找出其中第K大的节点。利用树的中序遍历,找出节点package helen.c;import java.util.Stack;public class FindTreeNode { public class TreeNode{ int val; TreeNode right; TreeNode left...原创 2019-08-14 14:40:46 · 271 阅读 · 0 评论 -
左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部,请定义一个函数实现字符串左旋转操作的功能。输入“abcdefg”,反转前两位,输出“cdefgab”package helen.d;public class ReverseString { public static void main(String[] args) { String stri...原创 2019-08-16 09:05:30 · 86 阅读 · 0 评论 -
第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff’,则输出b。我们创建一个长度为256的数组,每个字母根据其ASCll码值作为数姐的下标对应数组的一个数字,而数组中存储的是每个字符出现的次数。package helen.c;public class OnesChars { public static void main(String[] args) {...原创 2019-08-12 15:09:16 · 94 阅读 · 0 评论 -
ccf 模拟题 24点问题
24点问题题目定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加法用符号 + 表示,减法用符号 - 表示,乘法用小写字母 x 表示,除法用符号 / 表示。在游戏里除法为整除,例如 2 / 3 = 0,3 / 2 = 1, 4 / 2 = 2。老师给了你 n 个游戏的解,请你编写程序验证每...原创 2019-09-01 11:14:21 · 1133 阅读 · 0 评论 -
小明放学 Java
题目背景 汉东省政法大学附属中学所在的光明区最近实施了名为“智慧光明”的智慧城市项目。具体到交通领域,通过“智慧光明”终端,可以看到光明区所有红绿灯此时此刻的状态。小明的学校也安装了“智慧光明”终端,小明想利用这个终端给出的信息,估算自己放学回到家的时间。问题描述 一次放学的时候,小明已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。同时,小明通过学校里安装的“智慧光明”终端,...原创 2019-09-02 16:14:10 · 231 阅读 · 0 评论 -
买菜 Java
package helana;import java.util.Scanner;public class a{ public static void main(String[] args) { Scanner input=new Scanner(System.in); int num=input.nextInt(); int time=...原创 2019-09-03 19:38:23 · 230 阅读 · 0 评论 -
钥匙盒
package helana;import java.util.Arrays;import java.util.Scanner;public class a{ public static void main(String[] args) { Scanner input=new Scanner(System.in); int classNum=input...原创 2019-09-05 11:33:15 · 137 阅读 · 0 评论 -
CCF JAVA火车购票
import java.util.Scanner;public class Main { public static boolean flag=false; public static void main(String[] args) { Scanner input = new Scanner(System.in); int num=input....原创 2019-09-09 09:58:53 · 249 阅读 · 0 评论 -
ccf java次数最多的数
import java.util.Arrays;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); int num=input.nextInt(); ...原创 2019-09-09 15:46:13 · 115 阅读 · 0 评论 -
CCF JAVA 窗口
import java.util.*;public class Main { public static void main(String[] args) { Scanner input =new Scanner(System.in); int windowTimes=input.nextInt(); int chickTimes=inp...原创 2019-09-09 20:40:10 · 168 阅读 · 0 评论 -
CCF CSP俄罗斯方块
import java.util.Scanner;public class Main { public static boolean flag=false; public static void main(String[] args) { Scanner input=new Scanner(System.in); int a[][]=new in...原创 2019-09-11 11:03:37 · 295 阅读 · 0 评论 -
树中两个节点的最低公共祖先
题目:输入一棵树的两个节点,返回他们的最低公共祖先。当这棵树是二叉查找树时;用递归从树的根节点开始遍历。 private TreeNode find(TreeNode node1, TreeNode node2, TreeNode root) { int val=root.value; if(val>node1.value&&val...原创 2019-08-17 18:44:24 · 348 阅读 · 0 评论 -
把字符串转换成整数
题目: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0这个要经过很多的判断,考虑各种不符合的情况首先字符串不能为空,字符串的第一位可以是正负号和数字,字符串剩下的每一位都要是数字,考虑越界的情况,首个符号是负号返回的结果也应该是负数,这个负数的结果可以最后一起加一个负号package helen.d;public c...原创 2019-08-17 16:01:16 · 141 阅读 · 0 评论 -
构建乘积数组
题目:给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。这个问题的关键在于将b[i]分成两个部分c[i] d[i] ,c[i]是数组的前一部分A[0]×A[1]×… ×A[i-1] d[i]是数组的后一部分A[i+1]×…×A[n-1],分别求出...原创 2019-08-17 15:13:54 · 120 阅读 · 0 评论 -
字符流中第一个只出现一次的字符
题目:请实现一个函数,用来找出字符流中第一个只出现一次的字符。例如,当从字符流中读出前两个字符"go"时,第一个只出现一次的字符是’g’; 当从该字符流中读出前6l个字符"google"时,第一个只出现一次的字符是’l’。• 字符只能一个接着一个从字符流中读出来。可以定义一个数据容器来保存字符在字符流中的位置。当一个字符第一次从字符流中读出来时,把它在字符流中的位置保存到数据容器里。...原创 2019-08-12 16:17:34 · 383 阅读 · 1 评论 -
滑动窗口最大值
题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5},思路:蛮力直接在每个滑动窗口依次比较找出最大值,时间复杂度太高。我们考虑把每个可能成为最大值的数字记录下来,就可以快速的得到最大值。声明一个双向队列,deq...原创 2019-08-16 10:58:55 · 127 阅读 · 0 评论 -
队列的最大值
题目:请定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的时间复杂度都是O(1)。一个dataQueue正常入列、出列元素,为了以O(1)的时间获取当前队列的最大值,需要使用一个maxQueue存放当前队列中最大值。具体来说就是,如果即将要存入的元素比当前最大值还大,那么存入这个元素;否则再次存入当前最大值。当数据队列新增加的元素比之...原创 2019-08-16 14:06:38 · 755 阅读 · 0 评论 -
n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。n个骰子,我们可以投掷n次,累加每次掷出的点数即可。因此要求出n个骰子的点数和,可以从n个骰子先取出一个投掷,这一个骰子只可能出现1-6中的某一个数,我们需要计算的是1-6每个点数与剩下n-1个骰子的点数和;接下来进行第二次投掷,现在骰子堆中还有n - 1个骰子,对于这n -1个骰子,继续从...原创 2019-08-16 18:20:22 · 157 阅读 · 0 评论 -
扑克牌中的顺子
题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这五张牌是不是连续的。大小王可以看成任意数字。package helen.d;import java.util.Arrays;public class ConTinousCard { public static void main(String[] args) { int a[]={0,0,9,10,5};...原创 2019-08-16 22:29:06 · 253 阅读 · 0 评论