剑指Offer
剑指Offer题目及相关常见编程题目
项目源码:https://github.com/zc-zangchao/zc
程序员Aike
Just Keep Coding
-- https://github.com/codeaike/
展开
-
剑指Offer-数据结构与算法题目(Java实现)
1、栈与队列【实现一个栈】【实现一个队列】【构造一个栈,取最大最小、pop()、push()都是o(1)】【两个栈实现一个队列】【两个队列实现一个栈】【栈的入栈、出栈序列】2、链表的基本操作【链表反转】【按k步反转链表】【取链表的倒数k个数&中间节点】【两个有序链表合成一个有序链表】【删除重复节点】【取两个链表的第一个交叉节点】【取链表中环的第一个节点】【约瑟...原创 2019-05-24 23:05:37 · 776 阅读 · 0 评论 -
[剑指Offer]机器人的运动范围(Java)
题目题目描述思路代码原创 2019-06-13 23:35:09 · 396 阅读 · 0 评论 -
[剑指Offer]矩阵中的路径(Java)
题目矩阵中的路径 -- newcoder 剑指Offer 65题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包...原创 2019-06-13 23:32:00 · 671 阅读 · 0 评论 -
[剑指Offer]滑动窗口的最大值(Java)
题目滑动窗口的最大值 -- newcoder 剑指Offer 64题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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}...原创 2019-06-13 22:53:56 · 2069 阅读 · 0 评论 -
[剑指Offer]数据流中的中位数(Java)
题目数据流中的中位数 -- newcoder 剑指Offer 63题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路 * 思路: * ...原创 2019-06-09 22:48:16 · 235 阅读 · 0 评论 -
[剑指Offer]字符流中第一个不重复的字符(Java)
题目字符流中第一个不重复的字符 -- newcoder 剑指Offer 53题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路 * 1、用一...原创 2019-06-07 15:26:00 · 388 阅读 · 2 评论 -
[剑指Offer]二叉搜索树的第k个结点(Java)
题目二叉搜索树的第k个结点 -- newcoder 剑指Offer 62题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路1、二叉搜索树的中序遍历有序递增2、中序遍历二叉树(递归/非递归),遍历到第k个元素即停止,则得到第k小元素代码package com.codinginte...原创 2019-06-09 14:52:18 · 771 阅读 · 0 评论 -
[剑指Offer]序列化二叉树(Java)
题目序列化二叉树 -- newcoder 剑指Offer 61题目描述请实现两个函数,分别用来序列化和反序列化二叉树.思路 * 思路1: * 1、非递归,层次遍历的思想 * 2、null节点用#表示,节点之间逗号隔开 * * 思路2: * 根据前序遍历规则完成序列化与反序列化。 * 所谓序列化指的是遍历二叉树为字符串; * 所谓反序列化指的是依据字符串重新构造成二叉树...原创 2019-06-09 13:43:04 · 615 阅读 · 0 评论 -
[剑指Offer]表示数值的字符串(Java)
题目表示数值的字符串 -- newcoder 剑指Offer 53题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路1、使用正则表达式2、遍历字符串,逐个情况判断代...原创 2019-06-07 10:42:45 · 382 阅读 · 0 评论 -
[剑指Offer]正则表达式匹配(Java)
题目字符串匹配 -- newcoder 剑指Offer 52题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路 * 1、逐...原创 2019-06-02 22:55:13 · 297 阅读 · 0 评论 -
[剑指Offer]构建乘积数组(Java)
题目构建乘积数组 -- newcoder 剑指Offer 51题目描述 * 给定一个数组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]。不能使用除法。思路解释下代码,设有数组大小为5。对于第一个for循环第一步:b[0] = 1;第二步:b[1...原创 2019-05-31 23:05:04 · 543 阅读 · 0 评论 -
[剑指Offer]数组中重复的数字(Java)
题目数组中重复的数字 -- newcoder 剑指Offer 50题目描述 * 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的, * 但不知道有几个数字是重复的。也不知道每个数字重复几次。 * 请找出数组中任意一个重复的数字。 * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出 * 是第一个重复的数字2。思路 *...原创 2019-05-29 22:39:30 · 505 阅读 · 0 评论 -
[剑指Offer]二叉树的下一个结点(Java)
题目 二叉树的下一个结点 -- newcoder 剑指Offer 57题目描述 * 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。 * 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路 * 分析二叉树的下一个节点,一共有以下情况: * 1.二叉树为空,则返回空; * 2.节点右孩子存在,则设置一个指针从该节点的右孩子出发, * 一...原创 2019-06-08 20:47:04 · 326 阅读 · 0 评论 -
[剑指Offer]对称的二叉树(Java)
题目对称的二叉树 -- newcoder 剑指Offer 58题目描述 * 请实现一个函数,用来判断一颗二叉树是不是对称的。 * 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路 * 思路1: * 1、递归判断两侧的节点是否是对称的 * * 思路2: * 1、非递归,层次遍历思想,但是 每次把最外侧节点插入队列 * 2、每次遍历当前层元素,弹出两个元...原创 2019-06-08 21:26:35 · 349 阅读 · 0 评论 -
[剑指Offer]把字符串转换成整数(Java)
题目把字符串转换成整数 -- newcoder 剑指Offer 49题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数...原创 2019-05-29 21:55:37 · 549 阅读 · 0 评论 -
[剑指Offer]求1+2+3+...+n(Java)
题目求1+2+3+...+n -- newcoder 剑指Offer 47题目描述 * 求1+2+3+...+n,要求不能使用乘除法、 * for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路 思路1、利用 && 的短路特性实现递归,n<=0时,不运行后面的语句 思路2、使用公式 1+2+...+n = n*(...原创 2019-05-28 22:45:44 · 776 阅读 · 0 评论 -
[剑指Offer]扑克牌顺子(Java)
题目扑克牌顺子 -- newcoder 剑指Offer 45题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了...原创 2019-05-26 23:05:25 · 262 阅读 · 0 评论 -
[剑指Offer]翻转单词顺序列(Java)
题目翻转单词顺序列 -- newcoder 剑指Offer 44题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。C...原创 2019-05-25 23:23:24 · 592 阅读 · 0 评论 -
[剑指Offer]和为S的两个数字(Java)
题目和为S的两个数字 -- newcoder 剑指Offer 42题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路 * 1、双指针,一个指向头节点,一个指向尾节点 * 2、数组有序,利用首尾指针,找到相差最大的和等于S的两个元素即可...原创 2019-05-24 23:04:52 · 270 阅读 · 0 评论 -
[剑指Offer]和为S的连续正数序列(Java)
题目和为S的连续正数序列 -- newcoder 剑指Offer 41题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的...原创 2019-05-24 22:23:28 · 2279 阅读 · 0 评论 -
[剑指Offer]第一个只出现一次的字符(Java)
剑指Offer题目第一个只出现一次的字符 --newcoder 剑指Offer 34题目描述 * 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符, * 并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路 * 1、遍历字符串,Hash存储字符串每个字符出现的次数 * 2、顺序遍历上面存储的结果,如果该字符出现次数为...原创 2019-05-22 09:48:44 · 414 阅读 · 0 评论 -
[剑指Offer]整数中1出现的次数(Java)
剑指Offer题目整数中1出现的次数(从1到n整数中1出现的次数) -- newcoder 剑指Offer 31题目描述 * 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? * 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现5次, * 但是对于后面问题他就没辙了。 * ACMer希望你们帮帮他,并把问题更加普遍化, *...原创 2019-05-20 23:27:41 · 922 阅读 · 0 评论 -
[剑指Offer]最小的K个数(Java)
剑指Offer题目最小的K个数 -- newcoder 剑指Offer 题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路1、构建容量为K的最大堆2、遍历数组,放入堆中代码package com.my.test.codinginterviews.array;import java.uti...原创 2019-05-18 18:30:42 · 1388 阅读 · 0 评论 -
[剑指Offer]二叉树中和为某一值的路径(Java)
剑指Offer题目二叉树中和为某一值的路径 -- newcoder 剑指Offer 24题目描述 * 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 * (注意: 在返回值的list中,数组长度大的数组靠前)思路 * 1、用深度优先搜索DFS * 2、每当DFS搜索到新节...原创 2019-05-18 15:17:05 · 563 阅读 · 0 评论 -
[剑指Offer]二叉搜索树的后序遍历序列(Java)
剑指Offer题目二叉搜索树的后序遍历序列 -- newcoder 剑指Offer 23题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路 * 1、后序遍历的特征为 根节点在序列的最后 值为rootVal * 2、序列上半部分的值都小于rootVal,下部分的值都大于rootVal...原创 2019-05-18 13:46:08 · 233 阅读 · 0 评论 -
[剑指Offer]从上往下打印二叉树(Java)
剑指Offer题目从上往下打印二叉树 -- newcoder 剑指Offer 22题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路1、利用队列进行层次遍历 2、每次弹出队列中的一个元素,并把左右孩子加入队列即可代码package com.my.test.codinginterviews.tree;import java.util.ArrayList;i...原创 2019-05-18 11:47:25 · 477 阅读 · 0 评论 -
[剑指Offer]栈的压入、弹出序列(Java)
剑指Offer题目栈的压入、弹出序列 -- newcoder 剑指Offer 21题目描述 * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。 * 假设压入栈的所有数字均不相等。 * * 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列, * 但4,3,5,1,2就不可能是该压栈序列的弹出序...原创 2019-05-18 10:59:18 · 307 阅读 · 0 评论 -
[剑指Offer]包含min函数的栈(Java)
剑指Offer题目包含min函数的栈 -- newcoder 剑指Offer 20题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))思路 * 1、使用两个栈,第一个容纳元素,第二个记录当前的最小值 * 2、第二个栈,push时,如果当前元素比栈顶元素小,则push一次当前栈顶元素, * 3、pop时,直接弹出栈顶元素即可...原创 2019-05-17 22:24:32 · 238 阅读 · 0 评论 -
[剑指Offer]顺时针打印矩阵(Java)
剑指Offer题目顺时针打印矩阵 -- newcoder 剑指Offer 17题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.思路 * 思路1: * ...原创 2019-05-17 21:11:52 · 191 阅读 · 0 评论 -
[剑指Offer]树的子结构(Java)
剑指Offer题目树的子结构 -- newcoder 剑指Offer 17题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路 * 思路1: * 1、层次遍历root1, 找到与root2相同的节点(此步骤非递归) * 2、找到后判断以此节点为根节点,是否能在root1中找到与root2相同的树结构(此处判断用递归查找) * ...原创 2019-05-17 09:32:59 · 219 阅读 · 0 评论 -
[剑指Offer]二叉树的镜像(Java)
剑指Offer题目二叉树的镜像 -- newcoder 剑指Offer 18题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11镜像二叉树 8 / \ 10...原创 2019-05-16 23:22:04 · 487 阅读 · 0 评论 -
[剑指Offer]调整数组顺序使奇数位于偶数前面(Java)
剑指Offer题目调整数组顺序使奇数位于偶数前面 -- newcoder 13题目描述 * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序, * 使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分, * 并保证奇数和奇数,偶数和偶数之间的相对位置不变。 思路 * 1.要想保证原有次序,则只能顺次移动或相邻交换。 * 2.i从左向右遍历,找到第一个偶数。 *...原创 2019-05-16 09:14:14 · 700 阅读 · 0 评论 -
[剑指Offer]数值的整数次方(Java)
剑指Offer题目数值的整数次方 -- 剑指Offer 12题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路 * 1、写出指数的二进制表达,例如13表达为二进制1101。 * 2、举例:10^1101 = 10^0001*10^0100*10^1000。 * 3、通过&1和&...原创 2019-05-15 20:28:11 · 362 阅读 · 0 评论 -
[剑指Offer]二进制中1的个数(Java)
剑指Offer题目二进制中1的个数 -- 剑指Offer 11原码、补码、反码 * 原码: * 原码(true form)是一种计算机中对数字的二进制定点表示方法。 * 原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1 * (0有两种表示:+0和-0),其余位表示数值的大小 * 【例】 * 十进制(7),原码表示为 0 0000111 * 十...原创 2019-05-15 17:15:12 · 462 阅读 · 0 评论 -
[剑指Offer]矩形覆盖(Java)
剑指Offer题目矩形覆盖 -- 剑指Offer 10题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路 数学推导: * n = 1 时 , f(1) = 1 * n = 2 时 , f(2) = 2 * n = 3 时 , f(1) = 3 * n = 4 时 , f(1) =...原创 2019-05-15 16:11:11 · 364 阅读 · 0 评论 -
[剑指Offer]变态跳台阶(Java)
剑指Offer题目变态跳台阶 -- 剑指Offer 9题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)所以f(n)=f(n-1)+f(n-2)+...+f...原创 2019-05-15 15:49:21 · 167 阅读 · 0 评论 -
[剑指Offer]旋转数组的最小数字(Java)
剑指Offer题目旋转数组的最小数字 -- 剑指Offer 6题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路根据数组部分有序的特点,采用二分...原创 2019-05-15 11:48:01 · 287 阅读 · 0 评论 -
[剑指Offer]二维数组中的查找(Java)
剑指Offer题目二维数组中的查找 -- 剑指Offer 1题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路1、根据数组特点,从右上角位置开始查找2、如果相等,返回true即可3、如果目标值大于当前值,忽略本行,继续查找...原创 2019-05-14 19:27:08 · 221 阅读 · 0 评论 -
[剑指Offer]从尾到头打印链表(Java)
剑指Offer题目从尾到头打印链表 -- 剑指Offer 3题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路遍历链表,把元素压入栈中,利用栈后进先出特性,遍历栈中元素,逐个打印代码package com.my.test.codinginterviews;import java.util.ArrayList;import java.util.St...原创 2019-05-14 19:53:13 · 300 阅读 · 0 评论 -
[剑指Offer]数组中的逆序对(Java)
题目数组中的逆序对 -- newcoder 剑指Offer 35题目描述* 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。* 输入一个数组,求出这个数组中的逆序对的总数P。* 并将P对1000000007取模的结果输出。 即输出P%1000000007思路 * 1、分开计算子序列的逆序对数 * 2、合并...原创 2019-03-28 09:24:53 · 1004 阅读 · 0 评论