算法
葫芦娃你好我是皮卡丘
Android开发
展开
-
29-1 :从1 到n的整数中1出现的次数
一、题目输入一个整数n,求从1 到n这n个整数的十进制表示中1 出现的次数。举例说明:例如输入12 ,从1 到12 这些整数中包含1 的数字有1、10、11 和12,1 一共出现了5 次。二、解题思路第一种:不考虑时间效率的解法累加1 到n 中每个整数中1出现的次数。我们可以每次通过对10 求余数判断整数的个位数字是不是1 。如果这个数字大于10,除以10 之后再判断个位数字是不是1...转载 2020-03-25 18:00:44 · 229 阅读 · 0 评论 -
28 连续子数组的最大和
一、题目输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例子说明:例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}。因此输出为该子数组的和18 。二、解题思路解法一:举例分析数组的规律。我们试着从头到尾逐个累加示例数组中的每个...转载 2020-03-25 15:38:06 · 144 阅读 · 0 评论 -
33 数组中的逆序对:输入一个数组,求出这个数组中的逆序对的总数。
一、题目在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。举例分析例如在数组{7, 5, 6, 4 中, 一共存在5 个逆序对,分别是(7, 6)、(7,5),(7, 4)、(6, 4)和(5, 4)。...转载 2019-09-11 15:38:17 · 722 阅读 · 0 评论 -
32 在字符串中找出第一个只出现一次的字符。
一、题目在字符串中找出第一个只出现一次的字符。转载 2019-09-10 17:00:16 · 704 阅读 · 0 评论 -
31 丑数
一、题目我们把只包含因子2、3 和5 的数称作丑数(Ugly Number)。求从小到大的顺序的第1500个丑数。举例说明:例如6、8 都是丑数,但14 不是,它包含因子7。习惯上我们把1 当做第一个丑数。...转载 2019-09-10 16:36:43 · 70 阅读 · 0 评论 -
30 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
一、题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例子说明:例如输入数组{3, 32, 321},则扫描输出这3 个数字能排成的最小数字321323。...转载 2019-09-10 15:20:11 · 2126 阅读 · 0 评论 -
27 最小的k个数: 输入n个整数,找出其中最小的k个数。
一、题目输入n个整数,找出其中最小的k个数。例子说明:例如输入4 、5 、1、6、2、7、3 、8 这8 个数字,则最小的4 个数字是1 、2、3 、4解法一:O(n)时间算法,只有可以修改输入数组时可用。可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于...转载 2019-09-06 15:07:50 · 3165 阅读 · 0 评论 -
最大堆的插入/删除/调整/排序
堆有最大堆和最小堆之分最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。最小堆便是每个节点的值都<=其左右孩子值的完全二叉树。https://www.cnblogs.com/lixiaolun/p/5117890.htmlhttps://blog.csdn.net/chen_lin111/article/details/50477642⑴最大堆的插入由于需...转载 2019-09-05 17:39:44 · 2272 阅读 · 0 评论 -
24 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表
一、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二、解题思路调整指针原先指向左子节点的指针调整为链表中指向前一个节点的指针原先指向右子节点的指针调整为链表中指向后一个节点的指针如何调整考虑根节点和左右子树的根本情况,因为如果用递归,这种根本情况考虑就可以去将同样的方法用到左右子树上对于这种基本情况,可以分...转载 2019-09-03 17:21:07 · 494 阅读 · 0 评论 -
23.复杂链表的复制: 请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表
一、题目请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个next 域指向下一个结点外,还有一个sibling 指向链表中的任意结点或者nullhttps://blog.csdn.net/xy199931/article/details/98492144public static Node co...转载 2019-09-03 11:28:00 · 289 阅读 · 0 评论 -
22.二叉树中和为某一值得路径: 输入一棵二叉树和一个整数, 打印出二叉树中结点值的和为输入整数的所有路径
一、题目输入一棵二叉树和一个整数, 打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径二、解题思路二叉树中有两条和为22的路径:一条路径经过结点10,5,7,另一条路径经过结点10,12由于路径是从根结点出发到叶结点,也就是说路径总是以根结点为起始点,因此我们要首先遍历根结点.在树的前序、中序、后序三种遍历方式中,只有前序遍历是访问根结...转载 2019-09-02 15:07:34 · 317 阅读 · 0 评论 -
26 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
参考链接:https://yq.aliyun.com/articles/642782一、题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。二、解题思路解法一:基于Partition 函数的O(n)算法数组中有一个数字出现的次数超过了数组长度的一半。如果把这个数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字。也就是说,这个数字就是统计学上的...转载 2019-08-17 17:21:08 · 1950 阅读 · 0 评论 -
21-1二叉树的前序 中序 后序
1.前序遍历前序遍历(DLR,lchild,data,rchild),是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。前序遍历结果:ABDECF2.中序遍历中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,先左后根再右。巧记:左根右。中序遍历结果:DBEAFC3.后序遍历后序遍历首...转载 2019-08-21 15:10:16 · 164 阅读 · 0 评论 -
21-2二叉搜索树的后序遍历: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果
一、题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true。否则返回false。假设输入的数组的任意两个数字都互不相同。二、解题思路在后序遍历得到的序列中, 最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小: 第二部分是右子树结点的值,它们都比根结点的值大。三、解题代码题目:输入一个整数数组,...转载 2019-08-20 15:20:34 · 1976 阅读 · 1 评论 -
11 调整数组顺序,使得所有奇数位于数组的前半部分:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位予数组的后半部分。
一、题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位予数组的后半部分。二、解题思路这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面。也就是说我们在扫描这个数组的时候, 如果发现有偶数出现在奇数的前面,我们可以交换它们的顺序,交换之后就符合要求了。因此我们可以维护两个指针,第一个指针初始化时...转载 2019-08-14 10:40:13 · 289 阅读 · 0 评论 -
35 (29-2)统计一个数字:在排序数组中出现的次数。
一、题目统计一个数字:在排序数组中出现的次数。举例说明例如输入排序数组{ 1, 2, 3, 3, 3, 3, 4, 5}和数字3 ,由于3 在这个数组中出现了4 次,因此输出4 。二、解题思路利用改进的二分算法。如何用二分查找算法在数组中找到第一个k,二分查找算法总是先拿数组中间的数字和k作比较。如果中间的数字比k大,那么k只有可能出现在数组的前半段,下一轮我们只在数组的前半段查找就可...转载 2019-09-11 18:16:48 · 144 阅读 · 0 评论 -
36 输入一棵二叉树的根结点,求该树的深度
一、题目输入一棵二叉树的根结点,求该树的深度。从根结点到叶子点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二、解题思路如果一棵树只有一个结点,它的深度为1。 如果根结点只有左子树而没有右子树, 那么树的深度应该是其左子树的深度加1,同样如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1. 如果既有右子树又有左子树, 那该树的深度就是其左、右子...转载 2019-09-12 10:28:06 · 1452 阅读 · 1 评论 -
37 输入一棵二叉树的根结点,判断该树是不是平衡二叉树
一、题目输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1 ,那么它就是一棵平衡二叉树。例如,下图中的二叉树就是一棵平衡二叉树。二、解题思路解法一:需要重蟹遍历结点多次的解法 在遍历树的每个结点的时候,调用函数treeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1 ,按照定义它就是一棵平衡的二叉树。 ...转载 2019-09-12 15:33:57 · 999 阅读 · 0 评论 -
54 一个链表中包含环,如何找出环的入口结点?
一、题目一个链表中包含环,如何找出环的入口结点?二、解题思路此问题包含两个步骤:(1)判断链表中是否有环(2)找出环一、1)选择快慢指针,让快指针每次走两步,慢指针每次走一步,若是单链表中有环的话,那么两个指针会相遇,即指向的相同的节点的值相等来判断。2)当相遇的时候,慢指针在环中走了k步,设环之外的部分长为x,环的长度为n,则快指针一共走了x+m*n+k步,(m为快指针在环中走的...转载 2019-10-08 14:21:47 · 222 阅读 · 0 评论 -
53 请实现一个函数用来找出字符流中第一个只出现一次的字符。
一、题目请实现一个函数用来找出字符流中第一个只出现一次的字符。举例说明例如,当从字符流中只读出前两个字符“Go”时,第一个只出现一次的字符是‘g’。当从该字符流中读出前六个字符“google”时,第一个只出现1次的字符是”l”。二、解题思路字符只能一个接着一个从字符流中读出来。可以定义一个数据容器来保存字符在字符流中的位置。当一个字符第一次从字符流中读出来时,把它在字符流中的位置保存到数...转载 2019-09-23 17:38:47 · 502 阅读 · 0 评论 -
61 滑动窗口的最大值
题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5}思路:滑动窗口应当是队列,但为了得到滑动窗口的最大值,队列序可以从两端删除元素,因此使用双端队列。原则:对新来的元素k,将其与双端队列中的元素相比较1)前...转载 2019-09-23 15:55:17 · 148 阅读 · 0 评论 -
52 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
一、题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例子说明例如,字符串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示数值,但“12e”,”1a3.14”,”1.2.3”,”±5”及“12e+5.4”都不是。二、解题思路原文链接:https://blog.csdn.net/weixin_38108266/article/details/8...转载 2019-09-20 17:51:09 · 1211 阅读 · 0 评论 -
50 构建乘积数组
一、题目给定一个数组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],不能使用除法。转载 2019-09-20 14:35:04 · 89 阅读 · 0 评论 -
48 求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针。
一、题目求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针。二、思路思路一: 该题首先要和面试官确定是否为二叉树,得到肯定答复后,还要确定是否为二叉搜索树,是否有父指针,或者仅仅是普通二叉树。1.树为二叉搜索树时,最低公共祖先结点的大小在两个树结点大小的中间。2.树为普通树时,使用遍历将子结点的信息往上传递。在左右子树中进行查找是否存在两个树结点,如果两个树结点分...转载 2019-09-17 18:32:27 · 272 阅读 · 0 评论 -
求1+2+…+n
题目 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。不能使用乘除法,不能使用循环语句、判断语句。可以考虑的有 单目运算符:++和–,双目运算符:+,-,移位运算符<<和>>,关系运算符>,<等,逻辑运算符&&,||,&,|,^,赋值=最有可...转载 2019-09-17 17:39:16 · 1004 阅读 · 0 评论 -
45 约瑟环问题:0, 1, … , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。
一、题目0, 1, … , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。二、解题思路方法一:采用链表来存放数据,每次对长度取余来实现循环将所有数字放入LinkedList链表中(LinkedList比ArrayList更适合增删操作)。假设当前删除的结点下标为removeIndex,则下一个要删除的结点的下标为:(removeI...转载 2019-09-17 14:44:28 · 1852 阅读 · 0 评论 -
44 从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的
一、题目从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身, A为1。 J为11、Q为12、 为13。小王可以看成任意数字。二、解题思路我们可以把5张牌看成由5个数字组成的数组。大、小王是特殊的数字,我们不妨把它们都定义为0,这样就能和其他扑克牌区分开来了。接下来我们分析怎样判断5个数字是不是连续的,最直观的方法是把数组排序。值得注意的是,由于0可以当...转载 2019-09-16 17:49:13 · 3184 阅读 · 0 评论 -
42 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
一、题目字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。举例说明比如输入字符串”abcdefg”和数字2,该函数将返回左旋转2 位得到的结”cdefgab”。二、解题思路以”abcdefg”为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符都分到第二部分。我们先分别翻转这...转载 2019-09-12 17:00:37 · 2143 阅读 · 0 评论 -
41 翻转单词顺序: 输入一个英文句子,翻转句子中单词的顺序,但单词内字的顺序不变
一、题目输入一个英文句子,翻转句子中单词的顺序,但单词内字的顺序不变。为简单起见,标点符号和普通字母一样处理。举例说明例如输入字符串”I am a student. ”,则输出”student. a am I”。二、解题思路第一步翻转句子中所有的字符。比如翻转“I am a student. ”中所有的字符得到”.tneduts a m a I”,此时不但翻转了句子中单词的顺序,连单词内...转载 2019-09-12 16:39:25 · 3401 阅读 · 3 评论 -
40 输入一个正数s,打印出所有和为s 的连续正数序列(至少两个数)。
一、题目输入一个正数s,打印出所有和为s 的连续正数序列(至少两个数)。举例说明例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打出3 个连续序列1~5、4~6 和7~8。二、解题思路考虑用两个数small 和big 分别表示序列的最小值和最大值。首先把small 初始化为1, big 初始化为2。如果从small 到big 的序列的和大于s,我们可以从序列中去掉...转载 2019-09-12 16:17:57 · 996 阅读 · 0 评论 -
输入一个递增排序的数组和一个数字s,在数组中查找两个数,得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
一、题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。举例说明例如输入数组{1 、2 、4、7 、11 、15 }和数字15. 由于4+ 11 = 15 ,因此输出4 和11 。二、解题思路我们先在数组中选择两个数字,如果它们的和等于输入的s,我们就找到了要找的两个数字。如果和小于s 呢?我们希望两个数字的和再大一...转载 2019-09-12 15:55:49 · 1396 阅读 · 0 评论 -
1 二维数组中的查找:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。。
一、题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。二、解题思路首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束。如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的...转载 2019-08-14 10:24:48 · 313 阅读 · 0 评论 -
请找出数组中任意一个重复的数字,但不能修改输入的数组
在一个长度为n+1的数组里面的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为9的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3由于不能修改输入的数组,我们可以创建一个长度为n+1的辅助数组,然后逐一把原数组的每个数字复制到辅助数组。如果原数组中被复制的数字是m,则把它复制到辅助数...转载 2019-08-13 21:00:41 · 209 阅读 · 0 评论 -
9 打印1到最大n位数:输入数字n,按顺序打印出从1到n位最大十进数的数值
一、题目输入数字n,按顺序打印出从1到n位最大十进数的数值。比如输入3,则打印出1、2、3一直到最大三位数即999。二、解题思路①使用一个n位的数组来存储每一位的元素。例如n位3,则000表示为[0,0,0]。使用递归的方式,存放每一位元素值。②同上,使用一个n位的数组来存储每一位的元素。然后循环执行加1运算,并在数组中进行模拟进位,直到最高位需要进位,则表示循环结束方法一 pu...转载 2019-08-05 14:11:34 · 314 阅读 · 0 评论 -
12 链表中倒数第k 个结点:输入一个链表,输出该链表中倒数第k 个结点。
一、题目输入一个链表,输出该链表中倒数第k 个结点。为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点。二、解题思路为了实现只遍历链表一次就能找到倒数第k 个结点,我们可以定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1步,第二个指...转载 2019-08-02 18:34:49 · 202 阅读 · 0 评论 -
13 反转链表:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
一、题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。二、解题思路①遍历。将指向下一个节点的指针指向上一个节点。②递归。先让指向下一个节点的指针为空,然后递归调用,最后再将指向下一个节点的指针指向上一个节点。链表翻转:递归public Node reverseList(Node node){ if(node==null || node.next==nu...转载 2019-08-02 18:13:45 · 1929 阅读 · 0 评论 -
14 合并链表: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
一、题目输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。二、解题思路Step1.定义一个指向新链表的指针,暂且让它指向NULL;Step2.比较两个链表的头结点,让较小的头结点作为新链表的头结点;Step3.有两种方法。①递归比较两个链表的其余节点,让较小的节点作为上一个新节点的后一个节点;②循环比较两个链表的其余节点,让较小的节点作为上一个新节点的后一...转载 2019-08-02 18:12:33 · 2409 阅读 · 0 评论 -
20.从上往下打印出二叉树: 从上往下打印出二叉树的每个结点,同一层的结点按照从左向右的顺序打印。
一、题目从上往下打印出二叉树的每个结点,同一层的结点按照从左向右的顺序打印。二、解题思路这道题实质是考查树的遍历算法。从上到下打印二叉树的规律:每一次打印一个结点的时候,如果该结点有子结点, 则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被打印出来为止。/** * 从上往下打印出二叉树的每个结点,向一层的...转载 2019-08-02 18:07:15 · 342 阅读 · 0 评论 -
19 栈的压入弹出序列
一、题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。二、解题思路解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。判断一个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈...转载 2019-08-02 15:25:40 · 90 阅读 · 0 评论 -
Java实现String的IndexOf方法
文章来源:https://blog.csdn.net/xiaocy66/article/details/84934398方法一public static int IndexOf(String src, String dst) throws Exception{ if(null == src || src.length() < 1 || null == dst || dst.len...转载 2019-07-15 11:09:33 · 1694 阅读 · 1 评论