
算法
文章平均质量分 77
安心写代码吧
不断学习的好学生
展开
-
网易面试题:男女小孩战队问题
题目描述:幼儿园有n个小朋友排为一个队伍,男生用“B”表示,女生用“G”表示。当男女同挨着时便会发生矛盾。需要对所排的队伍进行调整,每次调整只能让相邻的小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:GGBGG->GGBGB->GGGBB这样就能使之前的两处男女相邻变为一处男女相邻,需要调整队形两次。程序输入:输入一个数据包原创 2017-03-25 16:34:07 · 1707 阅读 · 0 评论 -
剑指Offer面试题67:机器人的运动范围 Java实现
题目:机器人的运动范围 地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向左,向右,向上,向下移动一格,但不能进入行坐标和列坐标的位数之和大于k的格子。例如:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18;但它不能进入方格(35,38),因为3 + 5+3+8 = 19.请问该机器人最多能到达多少个格子?原创 2016-10-23 10:13:32 · 2587 阅读 · 0 评论 -
剑指Offer面试题43:n个色子的点数
以下算法和程序转自该博客:http://blog.youkuaiyun.com/derrantcm/article/details/46784575题目:n个色子的点数 把n个色子仍在地上,所有色子朝上一面的点数之和为s,输入n,打印出s的所有可能值出现的概率算法分析:算法1.基于递归求色子点数,时间效率不高现在我们考虑如何统计每一个点转载 2016-09-26 23:31:36 · 839 阅读 · 0 评论 -
剑指offer面试题39:二叉树深度与平衡二叉树
题目一:二叉树深度 输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为数的深度题目二:平衡二叉树 输入一颗二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。例如,图中即为一颗平衡二叉树。原创 2016-09-26 21:56:07 · 396 阅读 · 0 评论 -
剑指Offer面试题53:正则表达式匹配 Java实现
题目:正则表达式匹配 请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符’.’表示任意一个字符,而‘*’表示它前面的字符可以出现任意次(含0次)。本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”及“ab*a”均不匹配。算法分析:以下算法代码转自博客:http://blog转载 2016-10-11 22:48:34 · 2442 阅读 · 0 评论 -
剑指Offer面试题52:构建乘积数组 Java实现
题目:构建乘积数组 给定一个数组A[0,1,2,……n-1],请构建一个数组B[0,1,……n-1],其中B中的元素B[i]=A[0]*A[1]*……A[i-1]*A[i+1]*……A[n-1].不能使用除法.算法分析:如果没有不能使用除法限制,可以用公式πA[j]/A[i]求得B[i].现在要求不能使用护发,只能使用其他方法。更高效的算法原创 2016-10-11 21:26:17 · 437 阅读 · 0 评论 -
剑指Offer面试题42:翻转单词顺序;左旋转字符串 Java实现
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符串的顺序不变。例如输入字符串:“I am a student”,则输出“student a am I”.算法分析:算法1: 将整个过程分成两步, 第一步:旋转句子中的所有字符,比如翻转I am a student中所有单词得到:“tneduts a ma I”。此时不但转载 2016-09-25 20:20:19 · 3336 阅读 · 0 评论 -
剑指Offer面试题41:求和为s的两个数字;求和为s的连续正数序列 Java实现
题目一:输入一个递增排序的数组和一个数字s,在数组中找两个数,使得他们的和刚好是s.如果有多对数字的和等于s,则输出任意一对即可。例如,输入数组{1,2,4,7,11,15}和数字15,则输出4和11(4+11=15)。算法分析:首先,我们会想到在数组中固定一个数字,再一次判断数组中其余n-1个数字与它的和是不是等于S。不过这个方法的时间复杂度为O(n^2),会不会有更快的方法?原创 2016-09-25 16:40:44 · 1891 阅读 · 0 评论 -
剑指Offer面试题51:数组中的重复数字
题目:数组中的重复数字 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出的重复数字是2或者3.算法分析:算法1.解决这个问题的一个简单的方法是先把输入的原创 2016-10-10 23:00:15 · 771 阅读 · 0 评论 -
剑指Offer面试题34:丑数 Java实现
题目:丑数 我们把包含因子2,3,和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6,8都是丑数,但14不是,因为它包含因子7.习惯上,我们把1当做第一个丑数。算法分析:1.所谓一个数m是另一个数n的因子,是指n能被m整除。也就是n%m==0. 根据丑数的定义,丑数只能被2,3,5整除。也就是说如果转载 2016-09-21 23:35:25 · 883 阅读 · 0 评论 -
剑指Offer面试题38:数字在排序数组中出现的次数 Java实现
题目:数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,则输出次数4.算法分析:既然输入的数组是排序的,那么我们很自然的想到利用二分查找算法。在题目给出的例子中,我们可以先用二分查找算法找到第一个3.由于3可能出现多次,因此我们找到的3的左右两遍可能都是3,于是我们在找到3的左右两边转载 2016-09-24 18:24:35 · 449 阅读 · 0 评论 -
剑指Offer面试题66:矩阵中的路径 java实现
题目:矩阵中的路径 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左右上下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3x4的矩阵中包含一条字符串“bcced"的路径。但该矩阵中不包含字符串"abcd",的路径,因为字符串的第一个字符b占据了矩阵中的第原创 2016-10-23 11:08:51 · 1452 阅读 · 0 评论 -
剑指Offer面试题54:表示数值的字符串
题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”,“5e2”,"-123","3.1416", "-1e-16"都表示数值,但“12e", "1a3.14" ,"1.2.3", "+-5"都不是。算法分析: 在数值之前可能有一个表示正负的’-‘或者’+’。接下来是若干个0到9的数位表示数值的原创 2016-10-12 22:27:12 · 303 阅读 · 0 评论 -
剑指Offer面试题55:字符流中第一个不重复的字符 Java实现
题目:字符流中第一个不重复的字符 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中读出前两个字符“go”时,第一个只出现一次的字符是“g”.当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是"l".算法分析: 字符只能一个接着一个从字符流中读出来。可以定义一个数据容器来保存字符在字符流转载 2016-10-12 22:36:43 · 492 阅读 · 0 评论 -
宽度优先搜索
宽度优先搜索又译为广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的转载 2017-03-24 23:03:16 · 1798 阅读 · 0 评论 -
剑指Offer面试题65:滑动窗口的最大值 Java实现
题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4.4,6,6,6,5}。算法分析: 如果采用蛮力法,这个问题似乎不难解决:可以扫描每一个滑动窗口的所有数字并找出其中的最大值。如果滑动窗口的大小为k,需要O(k)时间才能找原创 2016-10-18 23:10:07 · 5325 阅读 · 0 评论 -
剑指offer面试题63:二叉搜索树的第k个节点 Java实现
题目:二叉搜索树的第k个节点 给定一颗二叉搜索树,请找出其中的第k大的节点。例如,下图中的二叉搜索树中,按节点数值大小顺序第三个节点的值 是4. 算法分析:如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。上图中的二叉搜索树的中序遍历序列为{2,3,4,5,6,7,8},因此,只需要用中序遍历算法遍历一棵二叉搜索树,就原创 2016-10-17 22:31:24 · 1250 阅读 · 0 评论 -
剑指Offer面试题62:序列化二叉树
题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。算法分析: 通过分析解决前面的面试题6.我们知道可以从前序遍历和中序遍历构造出一棵二叉树。受此启发,我们可以先把一棵二叉树序列化成一个前序遍历序列和一个中序序列,然后再反序列化时通过这两个序列重构出原二叉树。 这个思路有两个缺点。一个缺点是该方法要求二叉树中不能用有数值原创 2016-10-17 22:23:28 · 460 阅读 · 0 评论 -
剑指Offer面试题61:按之子型打印二叉树 Java实现
题目:按之字型打印二叉树 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。例如,按之字型打印下图的二叉树结果为:13 24 5 6 715 14 13 12 11转载 2016-10-16 22:57:37 · 1776 阅读 · 0 评论 -
剑指Offer面试题60:把二叉树打印成多行 Java实现
题目:把二叉树打印成多行 从上到下按层打印二叉树,同一行的节点从左到右的顺序打印,每一层打印到新的一行。例如,打印下图的二叉树结果为:8,6 105 7 9 11算法分析:为了把二叉树的每一行单独打印到一行里,我们需要两个变量:一个变量表示在当前层还没有打印的节点数,另一个变量表示下一层的节点数目。转载 2016-10-16 22:46:36 · 808 阅读 · 0 评论 -
剑指Offer面试题57:删除重复链表 Java实现
题目:删除重复链表 在一个排序的链表中,删除其中的重复节点,例如,链表A: A:1->2->2->4->4->6 删除重复节点后的链表B为: B:1->4->6.算法分析: 解决这个问题的第一步是确定删除的参数。当然这个函数需要输入待删除链表的头结点。头结点可能与后面的结点原创 2016-10-13 23:41:48 · 393 阅读 · 0 评论 -
剑指Offer面试题59:对称二叉树 Java实现
题目:对称二叉树 请实现一个函数,用来判断一颗二叉树是不是对称的。如果一颗二叉树和它的镜像一样,那么它是对称的。算法分析: 如上图所示,图(1)位一颗对称二叉树,图(2)和图(3)都不是对称二叉树算法描述:见程序算法源程序:/**********************************原创 2016-10-14 21:46:19 · 336 阅读 · 0 评论 -
剑指Offer面试题58:二叉树的下一个节点
题目:二叉树的下一个节点 给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。算法分析:整个算法中需要考虑的二叉树情况分为两类:1.有右子树的:那么下个结点就是右子树最左边的点;2.没有右子树的: a)是父节点左孩子,那么父节点就是下一个节点 ;原创 2016-10-14 21:36:41 · 515 阅读 · 0 评论 -
剑指Offer面试题56:链表中环的入口节点 Java实现
题目:链表中环的入口节点 一个链表中包含环,如何找出环的入口节点?例如,下图中的入口节点是3. 1->2->3->4->5->6 ^ | | |原创 2016-10-13 23:33:11 · 846 阅读 · 0 评论 -
剑指Offer面试题40:数组中只出现一次的数字 Java实现
题目:数组中只出现一次的数字 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(l).例如,输入数组{2,4,3,6,3,2,5,5},因为只有4、6这两个数字只出现一次,其他数字出现两次,所以输出4和6.算法分析:(并没有想清楚是什么原理)这两个题目都在强调一原创 2016-09-25 11:25:00 · 750 阅读 · 0 评论 -
剑指Offer面试题49:把字符串换成整数
题目:把字符串换成整数算法分析:这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串”“,正负号,溢出等方方面面的测试用例都考虑到,并且在写代码的时候对这些特殊的输入都定义好合理的输出。当然,这些输出并转载 2016-10-10 21:19:45 · 390 阅读 · 0 评论 -
剑指Offer面试题44:扑克牌的顺子 Java实现
题目:扑克牌的顺子 从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2——10为数字本身,A为1,J为11,Q为12,K为13,而大小王为任意数字。算法分析:我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把五张牌看成由五个数字组成的数组。大小王是特殊的数字,我们不妨把他们定义为0,这样就能和其他牌区分开来了。转载 2016-10-09 20:57:01 · 2927 阅读 · 0 评论 -
剑指Offer面试题30:最小的k个数 Java不同算法实现
题目:输入N个整数,找出其中最小的k个整数。例如输入 4,5,1,6,2,7,3,8,输入k=4,则输出最小的四个数是1,2,3,4算法分析:算法1.O(n)的算法,修改输入的数组可以基于getMiddle函数来解决此问题。如果基于数组的第k个数字来调整,使得第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整后,位于数组左边的k个原创 2016-09-18 21:13:15 · 659 阅读 · 0 评论 -
剑指offer面试题19:二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出他的镜像树。算法分析: 求一棵树的镜像过程:我们先前序遍历这棵树的每一个节点,如果遍历到节点有子节点,就交换它的两个子节点。当交换完所有非叶子子节点的左右子节点后,就得到了树的镜像。以下摘自“剑指Offer”书中树的镜像是一个比较新的概念,我们未必能够一下子相出求树的镜像的方法。为了能够形成直观的转载 2016-09-05 20:21:32 · 541 阅读 · 0 评论 -
剑指offer面试题18:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。算法分析: 要查找树A中是否存在和树B结构一样的子树,我们可以分为两步,第一步:在树A中找到和树B的根节点的值一样的节点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。以上面两棵树为例来详细分析这个过程。首先我们试着在树A中找到值为8(树B的根节点的值)得节点。转载 2016-09-02 21:40:56 · 545 阅读 · 0 评论 -
剑指offer面试题14:调整数组顺序使奇数位于偶数前面
题目:调整数组顺序使奇数位于偶数前面。 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分 算法分析:此题并没有强调要保证排序后的顺序,只需要将所有奇数位于前面,偶数位于后面即可。可以设计两个指针p1,p2,第一个指针初始化指向数组的第一个数字,它只向后移动;第二个指针初始化原创 2016-08-22 22:06:37 · 358 阅读 · 0 评论 -
剑指Offer面试题21:包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push、pop的时间复杂度都为O(l)。算法分析:要保证当栈中最小元素被弹出栈后,能在栈中找到一个次小的元素弹出。因此,我们可以把每次最小元素都保存起来放到另外一个辅助栈里。首先往空的数据栈里压入数字3,显然现在数字3是最小值,我们也把这个最小值压入辅助栈中。接下来想数据栈转载 2016-09-11 17:33:44 · 337 阅读 · 0 评论 -
剑指Offer面试题20:顺时针打印矩阵 Java实现
题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数字。例如,输入: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15原创 2016-09-10 16:52:01 · 1402 阅读 · 0 评论 -
剑指offer 面试题9:斐波那契数列
题目:求斐波那契Fibonacci数列 求函数f(n) = 0 n = 0 = 1 n = 1 = f原创 2016-08-02 21:28:36 · 438 阅读 · 0 评论 -
剑指Offer面试题8:寻找旋转数组的最小元素
题目:求一个旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素。例如, {1,2,3,4,5}的一个旋转数组为{3,4,5,1,2},该数组的最小元素为1. 旋转数组的特点:(1)递增排序的数组旋转之后可以划分为两个排序的子数组;(2)前面的子数组的转载 2016-07-24 22:17:46 · 321 阅读 · 0 评论 -
将任意整数数组中的0都都放在数组最后
题目描述:从键盘任意输入一个整数数字,将此整数数组中所有包含的0都放在数组的最后,非0项顺序不变(Java实现)算法描述: 1.首先要先找到此数组中的第一个为0项,并将此项下标值赋给k,再找到k后的第一个非0项,并将此项的下标值 赋给i,此时,调换下标为K和i的数组的两个值,例如,6,3,0,0,7,0中,第一个0项的下标为k,此时k=1,i=2,将 k和i的值对调,新数组即变原创 2016-03-27 00:27:59 · 4459 阅读 · 0 评论 -
剑指Offer面试题45:圆圈中最后剩下的数字
题目:圆圈中最后剩下的数字 0,1,2,3,4……n这n个数字排列成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈最后剩下的一个数字。算法分析:本题是有名的约瑟夫(josephuse)环问题。 例如,0,1,2,3,4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是:2,0,4,1,因此最后剩下的元素是转载 2016-10-09 20:59:29 · 438 阅读 · 0 评论 -
Java实现数组的快速排序(快速排序算法)
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择数字小的数字移动到数组的左边,比选择数字大的数字移动到数组的右边。具体的实现算法为:设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个元素)作为基准点,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序,然后采用递归调用,分别以同样转载 2016-07-24 17:45:45 · 16363 阅读 · 3 评论 -
剑指Offer面试题36:数组中的逆序对
题目:数组中的逆序对 在数组中的两个数如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求这个数组中逆序对的总数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(6,4)、(5,4)。算法分析:算法1.顺序扫描整个数组。每扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字转载 2016-09-23 20:41:34 · 335 阅读 · 0 评论 -
剑指Offer面试题47:不用加减乘除做加法 Java实现
题目:不用加减乘除做加法 写一个函数,求两个整数之和,要求在函数体内不得使用+,-,x,÷四则运算符号。算法分析:面试的时候被问道这个问题,首先我们分析人们是如何进行十进制的加法的,比如是如何得出5+17=22的结果的,实际上,我们可以分三步进行:第一步只做各位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为10;第三步,把前转载 2016-10-10 21:09:33 · 490 阅读 · 0 评论