剑指offer
IDEA_TEYU_1112
其实吧压力也没那么大
展开
-
牛客网刷题java之机器人的运动范围
题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:采用回溯法,用visit来标记是...原创 2020-02-03 15:28:40 · 237 阅读 · 0 评论 -
牛客网刷题之剪绳子
题目:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。思路:不难发现,这个数只能由2和3组成,且3的数目大于2的数目通过对3...原创 2020-02-03 12:29:23 · 312 阅读 · 0 评论 -
牛客网刷题java之滑动窗口的最大值(239. 滑动窗口最大值)暴力解法
执行结果:通过显示详情执行用时 :39 ms, 在所有 Java 提交中击败了26.33% 的用户内存消耗 :41.8 MB, 在所有 Java 提交中击败了31.23%的用户题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6...原创 2020-02-03 12:08:51 · 322 阅读 · 0 评论 -
牛客网刷题之字符串的全排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:这道题和Leetcode活字印刷的那道题很相似,可以用一个visit来表示是否访问过,相同的字符且回退过了也是重...原创 2020-02-03 11:20:01 · 429 阅读 · 0 评论 -
牛客网刷题java之输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路:要想让乘机最小,那么就得让它们之间的差最大比如91*8=82*7=143*6=184*5=20所以我们就利用两个指针一个在头一个在尾,如果当前的和大了,则让尾指针--,否则头指针++代码:import java.u...原创 2019-05-31 10:37:07 · 1135 阅读 · 1 评论 -
牛客网刷题java之翻转单词顺序列
题目:翻转单词顺序列,牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?第一种...原创 2019-05-31 10:06:56 · 298 阅读 · 0 评论 -
牛客网刷题java之把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:代码:public class Solution { public int GetUglyNumber_Solution(int index) { //小于6的...原创 2019-05-31 08:56:25 · 1318 阅读 · 1 评论 -
牛客网刷题java之给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 z1 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=...原创 2019-05-30 16:38:46 · 800 阅读 · 0 评论 -
牛客网刷题java之左旋转字符串对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!第一种字符串拼接代码:public class Solution { public...原创 2019-05-30 16:11:01 · 622 阅读 · 0 评论 -
牛客网刷题java之矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符...原创 2019-05-30 15:27:51 · 332 阅读 · 0 评论 -
牛客网刷题java之输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:代码:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(i...原创 2019-05-17 16:42:32 · 816 阅读 · 2 评论 -
牛客网刷题java之数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:先用Boyer-Moore Majority Vote Algorithm算法,即多数投票问题,找到序列中出现次数超过一半的的元素再判断题目的条件,看是否出现次数...原创 2019-05-17 11:04:13 · 2539 阅读 · 0 评论 -
牛客网刷题java之输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:第一步,在原节点后面创建一个相同的节点,其实就是链表插入的过程第二步,遍历克隆的节点,让它的random等于原来的随机的next,也就是下一个节点...原创 2019-05-17 09:27:05 · 1975 阅读 · 2 评论 -
牛客网刷题java之输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:需要注意的地方:new ArrayList<Integer>(in)这个构造方法直接传入一个list作为创建的list的值做递归的一个技巧,尽量新创建一个函数,递归的过程尽量没有参数,没有返回值,这样递归...原创 2019-05-16 20:56:41 · 1434 阅读 · 1 评论 -
牛客网刷题java之输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二叉搜索树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的...原创 2019-05-16 19:28:02 · 1722 阅读 · 4 评论 -
牛客网刷题java之输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
题目:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出...原创 2019-05-31 11:11:36 · 421 阅读 · 0 评论 -
牛客网刷题java之第一个只出现一次的字符
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路:因为本题的字符是有限的,所以,可以把字符的ASCII值当做索引来进行计数代码:public class Solution { public int FirstNotRepeatingChar(St...原创 2019-05-31 14:35:25 · 321 阅读 · 0 评论 -
牛客网刷题java之请实现两个函数,分别用来序列化和反序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树思路:其实这道题没有说的特别明白,序列化就是按照前序遍历的顺序将其输出为一个字符串,节点为空则用#代替,反序列化就是讲一个字符串恢复成为一个树。代码中需要注意的方法:字符串的indexof方法,没有的话则返回-1字符串的substring方法,包含头不包含尾,如果只输入一个参数的话,则由当前位置到最后判断字符串内容是否...原创 2019-05-29 20:41:24 · 1015 阅读 · 0 评论 -
牛客网刷题java之孩子们的游戏,约瑟夫环问题
题目:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去......原创 2019-05-29 19:34:57 · 423 阅读 · 0 评论 -
牛客网刷题java之字符流中第一个不重复的字符
题目:字符流中第一个不重复的字符请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:用一个int数组来存储字符出现的次数,一共256个字符,所以数组...原创 2019-06-01 18:46:30 · 321 阅读 · 0 评论 -
牛客网刷题java之扑克牌顺子
题目:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为...原创 2019-05-29 16:14:59 · 457 阅读 · 0 评论 -
牛客网刷题之写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方式计算二进...原创 2019-05-29 15:25:02 · 615 阅读 · 0 评论 -
牛客网刷题java之输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:中序遍历,利用中间变量将彼此指针互相连接。代码:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; ...原创 2019-05-29 14:45:04 · 1414 阅读 · 0 评论 -
牛客网刷题java之顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:利用行和列的边界值逐渐往内缩小代码:import java.util.ArrayList;pu...原创 2019-05-29 09:59:09 · 291 阅读 · 0 评论 -
牛客网刷题java之输入两个链表,找出它们的第一个公共结点。
题目:输入两个链表,找出它们的第一个公共结点。思路:设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问...原创 2019-05-29 09:07:03 · 893 阅读 · 2 评论 -
牛客网刷题java之字形顺序打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:与分层打印二叉树类似,只不过在打印完每一层之后将集合中的内容反转arraylist的方法add增加一个元索如果队列已满,则抛出一个IIIegaISla...原创 2019-05-28 21:24:31 · 278 阅读 · 1 评论 -
牛客网刷题java之连续子数组的最大和
题目:连续子数组的最大和思路:像是一个窗口,从头开始,如果目前的和大于0,说明还可以继续往下加,如果小于0,则放弃前面的,从当前值开始,你可能会疑问,直接放弃是不是会落下一些值,不会的,因为max一直在记录最大值,在前面加的过程中已经记录了这个连续过程的最大值。代码:public class Solution { public int FindGreatestSumO...原创 2019-05-31 16:19:24 · 314 阅读 · 0 评论 -
牛客网刷题java之构建乘积数组
题目:给定一个数组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]。不能使用除法。思路:循环两次,从左往右,从右往左,在循环的过程中直接累乘代码:import java.util.ArrayList;public class Solution { ...原创 2019-05-31 15:41:59 · 223 阅读 · 0 评论 -
牛客网刷题java之从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:利用队列来进行实现,首先要知道队列的方法下表显示了jdk1.5中的阻塞队列的操作:arraylist的方法 add增加一个元索如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove移除并返回队...原创 2019-05-21 21:25:28 · 1521 阅读 · 0 评论 -
牛客网刷题java之给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:利用中序遍历,二叉搜索树的中序遍历就是从小到大排序之后的数组,所以,我把树进行中序遍历,用count标记第几个,那么就可以找到第k个小的数了代码:/*public class TreeNode { int val = 0;...原创 2019-05-21 20:40:56 · 1701 阅读 · 0 评论 -
牛客网刷题java之输入一个链表,反转链表后,输出新链表的表头。
题目:输入一个链表,反转链表后,输出新链表的表头。思路:代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { publi...原创 2019-05-14 20:38:21 · 1613 阅读 · 2 评论 -
牛客网刷题java之输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
牛客网刷题java之输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* ...原创 2019-05-12 19:23:16 · 1081 阅读 · 3 评论 -
牛客网刷题java之去除空格,将一个字符串中的每个空格替换,利用的是Stringbuffer
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。public class Solution { public String replaceSpace(StringBuffer str) { //首先判断是否为空,为空后续将不再执行 if(str==...原创 2019-05-12 18:41:40 · 984 阅读 · 1 评论 -
牛客网刷题java之在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码以及思路:public class Solution { public boolean Find(int target, int [][] array) { /*...原创 2019-05-10 19:45:51 · 3342 阅读 · 1 评论 -
牛客网刷题java之输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树
今天在牛客网刷到了一个比较难的题目,看了大佬的代码,特此过来详细分析,以加深印象。题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解这道题的关键一个是思路,一个是找代码中的关键边界值。...原创 2019-05-13 11:12:44 · 2013 阅读 · 2 评论 -
牛客网刷题java之把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。import java.util.ArrayList;/*本题的一个简单算法就是从左到右遍历,由于是递增的,...原创 2019-05-13 16:35:54 · 1283 阅读 · 0 评论 -
牛客网刷题java之用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型
题目:两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型首先做这道题得知道栈的三个基本的方法:1.pop():移除栈顶,并作为返回值返回给函数。2.push(item):入栈3.isEmpty()判断栈是否为空思路:代码:import java.util.Stack;/*思路:一个用于入队,一个用于出队,两个栈之间的值相互转换*...原创 2019-05-13 19:06:42 · 1285 阅读 · 0 评论 -
牛客网刷题java之输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39首先得知道什么是斐波那契数列斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13...原创 2019-05-13 19:40:46 · 5193 阅读 · 1 评论 -
牛客网刷题java之(斐波那契数列)一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。分析:对于本题,前提只有 一次 1阶或者2阶的跳法。a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)c.由a\b假设可以得出总跳法...原创 2019-05-13 20:10:48 · 771 阅读 · 1 评论 -
牛客网刷题java之变态跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:其实和普通的只能跳一个和两个台阶的思路是一样的,都是为了求迭代表达式。普通跳台阶(只能跳1或2):假设我第一次跳1个,那么剩下的次数就是f(n-1)假设我第一次跳2个,那么剩下的次数就是f(n-2)所以f(n)=f(n-1)+f(n-2),然后再加上...原创 2019-05-13 20:35:11 · 887 阅读 · 0 评论