剑指offer-牛客网-java
文章平均质量分 68
随风而醒
我是个疯子,虽然我在服新药,但仍旧有幻觉
展开
-
剑指offer-二维数组查找
看着问题抄下来了,好多细节,有点烦:p41-《剑指offer》public class Solution { public boolean Find(int [][] array,int target) { int rows=array.length;int columns=array[0].length;boolean f=false;if(array原创 2016-01-06 21:13:03 · 400 阅读 · 0 评论 -
剑指offer-机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?package demo1;import org.原创 2016-11-08 16:13:40 · 803 阅读 · 0 评论 -
剑指offer-矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩原创 2016-11-08 15:41:25 · 770 阅读 · 0 评论 -
剑指offer-滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1原创 2016-11-07 21:16:34 · 960 阅读 · 0 评论 -
剑指offer-二叉搜索树的第k个结点
题目描述给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。分析 通过中序遍历列出节点顺序列表 更加优化的解决办法是直接在遍历的时候将k值带进去O(k)-O(n)import java.util.ArrayList;/*public class TreeNode { int val = 0;原创 2016-11-07 20:07:22 · 613 阅读 · 0 评论 -
剑指offer-表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。解析 对于java有多种方法,这里首先提供一般的方法:分类处理在牛客网上还看到各种解法,虽然都是依靠java强大的函数库或者是java自己的一些原创 2016-08-30 13:04:57 · 1086 阅读 · 0 评论 -
剑指offer-字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。分析: 简单的做法是直接定义一个二维数组,存放(字符–数目) 但,java中有一个非常方便的linkedhash原创 2016-08-30 12:55:39 · 519 阅读 · 0 评论 -
剑指offer-链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。分析1,找一个环中的节点 2,通过环中的节点,通过遍历计算环中的节点个数 3,如果链表中环 有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点,此时两个节点恰好在入口处相遇,即入口节点。class ListNode { int va原创 2016-08-30 10:01:05 · 620 阅读 · 0 评论 -
剑指offer-二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析二叉树的下一个节点,一共有以下情况: 1.二叉树为空,则返回空; 2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点; 3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继原创 2016-08-30 09:27:24 · 614 阅读 · 0 评论 -
剑指offer-对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同 左子树的右子树和右子树的左子树相同即可,采用递归 非递归也可,采用栈或队列存取各级子树根节点class TreeNode { int val = 0; TreeNode left = null;原创 2016-08-28 11:58:06 · 754 阅读 · 0 评论 -
剑指offer-数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路我们把所有输入分为两个堆,最小堆存放前一半数值比较小的数,最大堆存放后一半数值比较大的数。 为了保证数据平均分配,我们要让两个堆数据的数目之差不超过1,因此,在总数目为偶数的时候,我们要把新数据插入最小原创 2016-08-28 11:32:19 · 662 阅读 · 0 评论 -
剑指offer-数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。解析:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 没一个数字敲好对应所在的坐标(映射关系)public boo原创 2016-08-17 14:45:12 · 475 阅读 · 0 评论 -
剑指offer-孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最后一原创 2016-08-17 11:17:57 · 1148 阅读 · 0 评论 -
剑指offer-扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的原创 2016-08-17 10:20:27 · 558 阅读 · 0 评论 -
剑指offer-左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!public String LeftRotateString(String str,int n) {原创 2016-08-17 09:57:03 · 496 阅读 · 0 评论 -
剑指offer-数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题分析:位算法中,相同的数字经过异或运算为0。现在数组中有两个数字只出现1次,直接异或一次只能得到这两个数字的异或结果,但光从这个结果肯定无法得到这个两个数字。因此我们来分析下简化版中“异或”解法的关键点,这个关键点也相当明显——数组只能有一个数字出现1次。设题目中这两个只出现1次的数字分别原创 2016-08-17 09:42:54 · 484 阅读 · 0 评论 -
剑指offer-序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class S原创 2016-11-08 17:14:07 · 620 阅读 · 0 评论 -
剑指offer-求1+2+3+…+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。简单思路:if (n == 1) { return 1; } else { return Sum_Solution(n - 1) + n; }这样有一个问题,不能使用if改进:原创 2016-08-17 11:51:02 · 560 阅读 · 0 评论 -
八大排序算法
文字说明部分转载自这里写链接内容 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速原创 2016-03-05 21:18:21 · 810 阅读 · 0 评论 -
剑指offer-删除链表中重复的节点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5“`import java.util.ArrayList; /* public class ListNode { int val; ListNode next = null;ListNode(in原创 2016-11-27 23:33:50 · 488 阅读 · 0 评论 -
剑指offer-最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解法一: O(n)的算法,只有当我们可以修改输入的数组时可用 从上一题中我们可以得到启发,我们同样可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样原创 2016-11-27 22:49:10 · 887 阅读 · 0 评论 -
剑指offer-正则表达式匹配
题目描述请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配解题思路分情况讨论:需要匹配的字符串和模式字符串都已经遍历完成,那么就是匹配成功的。如果需要匹配的原创 2016-11-29 18:15:31 · 445 阅读 · 0 评论 -
剑指offer-按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。分析 二叉树的层次遍历,为了之字形记录数据需要一个备用栈(注意:由于是之字形打印,所以需要栈而不是队列,另外需要一个方向标记来选择打印方向) 参考:层次打印二叉树ArrayList<ArrayList<Integer>> Print(TreeNo原创 2016-10-30 18:22:17 · 646 阅读 · 0 评论 -
剑指offer-将二叉树打印为多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。分析利用二叉树的层次遍历;注意:此时的层次遍历需要保存单独保存每一列的数据,所以需要一个辅助队列(共两个队列)ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> result = new Array原创 2016-10-30 16:56:18 · 620 阅读 · 0 评论 -
剑指offer-把字符串转换为整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空输出描述: 如果是合法的数值表达则返回该数字,否则返回0输入例子: +2147483647 1a33输出例子: 2147483647 0public int StrToInt(String str原创 2016-10-30 15:44:49 · 646 阅读 · 0 评论 -
剑指offer-翻转单词顺序
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?package demo1;i原创 2016-10-30 15:19:42 · 984 阅读 · 0 评论 -
剑指offer-把数组排列成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路(转载-剑指offer有大小证明)先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab < ba,原创 2016-10-30 14:57:24 · 626 阅读 · 0 评论 -
剑指offer-整数中1出现的次数
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。分析(转载-编程之美)设N = abcde ,其中abcde分别为十进制中各位上的数字。 如果要计算百位上1出原创 2016-10-30 14:25:56 · 903 阅读 · 0 评论 -
剑指offer-数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%10原创 2016-10-29 23:57:19 · 669 阅读 · 0 评论 -
剑指offer-数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法一:O(n)package demo1;import org.junit.Test;public class Solution { public int MoreThanH原创 2016-10-29 13:09:40 · 565 阅读 · 0 评论 -
剑指offer-字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。分析: 1、把字符串分成两部分,一部分是第一个字符,另一个部分是后面其余的字符串 2、拿第一个字符和后原创 2016-10-28 23:28:00 · 711 阅读 · 0 评论 -
剑指offer-二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路 通过先序遍历树节点,通过栈的方式来回溯解法一:简化package demo1;import java.util.ArrayList;import java.util.Stack;class TreeNode { int val = 0;原创 2016-10-28 21:53:29 · 611 阅读 · 0 评论 -
数相乘、大数相加、大数相减Java版本
转载自lichong_87题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现。否则的话可以使用如下方式来实现。 大数相乘:假设有A和B两个大数,位数分别为a和b。根据我们平常手动计算乘法的方式可以看出,最终的结果的位数c一定小于等于a+b,我们可以举一个简单的例子来说明,99*99转载 2016-04-17 19:58:53 · 786 阅读 · 0 评论 -
如何从最大的N个数中选出最大或者最小的n个数
转载自:网易博客-有何不可这 个问题我前前后后考虑了有快一年了,也和不少人讨论过。据我得到的消息,Google和微软都面过这道题。这道题可能很多人都听说过,或者知道答案(所谓 的“堆”),不过我想把我的答案写出来。我的分析也许存有漏洞,以交流为目的。但这是一个满复杂的问题,蛮有趣的。看完本文,也许会启发你一些没有想过的解决方案(我一直认为堆也许不是最高效的算法)。在本文中,将会一直以寻转载 2016-04-25 23:04:14 · 4162 阅读 · 0 评论 -
剑指offer-和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 分析:左右相逼乘积最小证明: * 假设:找到两组满足条件的数组对(x,y)、(x+a,y-a),其中(x+y=S, 0 * x*y-[(x+a)(y-a)] * =x*y-x*y-(y-x)a+a2 *原创 2016-03-15 12:23:29 · 602 阅读 · 0 评论 -
剑指offer-从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入下图的二叉树,则一次打印出8,6,10,5,7,9,11.这道题实质上考察的就是树的遍历算法,只是这种遍历不是我们熟悉的前序、中序或者后序遍历。由于我们不太熟悉这种按层遍历的方法,可能已下载也想不清楚遍历的过程。因为按层打印的顺序决定应该先打印的根节点,所以我们从树的根节点开始分析原创 2016-03-11 10:14:49 · 901 阅读 · 0 评论 -
剑指offer-包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数分析(分析转载自此网页):google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的原创 2016-03-09 00:18:03 · 907 阅读 · 0 评论 -
剑指offer-栈的压入、弹出序列(标志:++)
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。解题思路:解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并原创 2016-03-09 14:19:02 · 749 阅读 · 0 评论 -
剑指offer-顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如输入以下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字原创 2016-03-07 20:04:03 · 493 阅读 · 0 评论 -
剑指offer-二叉树镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7原创 2016-03-07 19:00:01 · 482 阅读 · 0 评论