打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣…
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   题目解析: 从前向后扫描时,移动元素会出现覆盖的情况,因此选择从后往前扫描: 遇到空格时,将空格以后的字符串都向后移动两个位置,空格处放%,因此需要从最后一个元素开始移动,避免元素覆盖. 代码 class Solution { public: void replaceSpace(char…
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.     解析: 1.有了行和列,我们就得在数组中选取一个数去array[ i][ j]和target比较大小,在这里我选取的是右上角的数去和target比较 a)如果array[ i][ j] > target 则向左走 即…
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算法时间复杂度为O(m+n),但是空间复杂度也是O(m+n),相当于是空间换时间 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ import jav…
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两种思路各有优势: 1.行枚举列二分O(nlogm)(列二分行枚举O(mlogn)) 2.从左下角或右上角移动O(m+n) 如果n,m一个特别大一个特别小选择方案1效率很高 其他情况选择第2中方案   替换空格: 题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We A…
LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public static void main(String[] args) { int[][]x = {{}}; System.out.println(x.length+" "+x[0].length); int[][]y = {{1}}; System.out.println(y.length+"…
1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次. 这个题目的核心思想是考虑:每个位是任意数字时,可以包含多少个这个位为1的数字 分了三种情况 class Solution { public int countDigitOne(int n) { //digit表示位因子,就是10.100.1000... long digit=1; int cou…
用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照…
开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3 / \ 4 5 / \ 1 2 给定的树 B: 4 / 1 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值. 限制: 0 <=…
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package Solution; /** * 剑指offer面试题4:替换空格 * 题目:请事先一个函数,把字符串中的每个空格替换成"%20". * 例如输入"We are happy.",则输出"We%20are%20happy.". * @author GL…
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这种顺序.解决方案二:栈的本质就是递归,直接使用递归的方式,打印一个节点的时候先打印它后面的节点,再打印该节点自身,实现反向打印解决方案三:遍历链表,把链表中的元素复制到ArrayList中,然后逆序打印ArrayList中的元素解决方案四:前三种解决方案本身属于在打印链表的时候不修改链表本身结构,在允许修改链…
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出二叉树并输出他的根节点. 在二叉树的前序遍历中,第一个数字总是树的根节点.在中序遍历中,树的根节点在序列的中间,左子树的节点的值位于根节点的左边,右子树节点的值位于根节点值的右边. 因此需要扫描中序遍历序列才能找到很结点的值,由此可以找到左子树的节点的个数和右子树节点的…
题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值的n次方就是将一个数自身连乘n次底数要考虑到正数.负数和零的情况指数要考虑到正整数,负整数和零的情况.可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果解法一:全面不高效,考虑到所有边界条件和负面…
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了long型能够表示的范围,在面试题11求数值的整数次方的时候题目中已经明确的提示了不考虑大数问题,在这道题中,用字符串或者数组表示大数是一种很简单有效的方法.用字符串表示大数也适用于大数加法.大数减法和大数的乘法问题. 下面代码是使用数组方式实现大数的产生和打印,在这道题中要特殊考虑的地方是如果实现整…
题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初始化时候指向数组尾部,第一个指针指向的数字总是偶数,第二个指针指向的数字总是奇数,如果第一个指针在第二个指针之前,则交换两指针指向的元素. package Solution; /** * 剑指offer面试题14:调整数组顺序是奇数位于偶数前面 * 题目:输入一个整数数组,实现一个函数来调整该数组中…
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点,通过遍历链表找到该节点的上一节点和下一节点的方法是行不通了.所以实现的思路是,根据给定的要删除的节点,可以直接找到其后年的节点,把后面的节点的内容复制到当前节点处,同时将当前节点指向其后面节点的后面节点保证链表不断开,再把下一节点删掉就相当于把给定的节点删除了. 需要考虑到的一点是,如果要删除的节…
题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变成0,与运算进行多少次就有多少个1. package Solution; /** * 剑指offer面试题10:二进制中1的个数 * 题目:请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数. * 例如,把9表示成二进制是1001,有2位是1,该函数输出2 * 解法:把整数减一和原来的数做…
题目:写一个函数,输入n,求斐波那契数列的第n项. package Solution; /** * 剑指offer面试题9:斐波那契数列 * 题目:写一个函数,输入n,求斐波那契数列的第n项. * 0, n=1 * 斐波那契数列定义如下:f(n)= 1, n=2 * f(n-1)+f(n-2), n>2 * @author GL * */ public class No9Fibonacci { public static void main(String[] args) { System.out…
剑指offer面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1 旋转数组的特点: 1,旋转之后的数组可以分为两个排序的子数组,且前面的子数组的元素都大于或等于后面子数组的元素. 2,最小或者最大元素位于两个子数组的分界 解题思路:在排序数组中,可以使用二分查找法进行查找 利用左右两个指针和中间指针元素大…
剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()-1份元素poll出来,添加到另为一个为空的队列中,再把队列中最后的元素poll出来两个队列在栈不为空的情况下始终是有一个为空,另一个不为空的.push添加元素到非空的队列中,pop把非空队列的元素转移到另一个空的队列中,直到剩下最后一个元素,这个元素就是要出栈的元素(最后添加到队列中的元素). pa…
题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; import java.util.Stack; /** * 剑指offer面试题7:用两个栈实现队列 * 题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, * 分别完成在队列尾部插入节点和在队列头部删除节点的功能. * @author GL…
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package Solution; /** * 剑指offer面试题4:替换空格 * 题目:请事先一个函数,把字符串中的每个空格替换成"%20". * 例如输入"We are happy.",则输出"We%20are%20happy.". * @author GL * */ publ…
目录 二维数组中的查找 替换空格 从尾到头打印链表 反转链表 重建二叉树 用两个栈实现队列 旋转数组的最小数字 斐波拉切数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整次方 链表中倒数第k个结点 合并两个排序的链表 调整数组顺序使奇数位于偶数前 树的子结构 二叉树的镜像 求\(1+2+--n\) 使用递归 利用构造函数 虚函数 不用加减乘除做加法 顺时针打印矩阵 包含min函数的栈 栈的压入.弹出序列 从上往下打印二叉树 二叉搜索树的后序遍历序列 数组中的逆序对 两个链表的第一个公…
删除链表中重复的结点:较难 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead==null||pHead.next==null)return pHead; ListNod…
★ 二维数组的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 找规律题, 只要从左下角或右上角出发,就可以一步步缩小范围, 比目标值小就向右/下,比目标值大就向左/上 替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 重点在于创…
面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. public class Solution { /** * @param matrix, a list of lists of integers * @param target, an integer * @return a boolean, indicate whether matrix contains…
1.二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 利用二维数组由上到下,由左到右递增的规律, 那么选取右上角a[row][col]与target进行比较,如果等于就直接找到, 当target小于元素a[row][col]时,那么target必定在元素a所在行的左边, 即col--: 当target大于元素a[row][col]时,那么tar…
二十一.调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 测试用例: 功能测试:输入数组中的奇数.偶数交替出现:输入的数组中所有偶数都出现在奇数的前面:输入的数组中所有奇数都出现在偶数的前面. 特殊输入测试:输入nullptr指针:输入的数组只包含一个数字. 只完成功能的解法: void record_odd_before_even(int *pData, int length) { if(…
面试题三:查找二维数组中元素问题 public static void main(String[] args){ int[][] num = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; search(num,7); } public static void search(int[][] arr,int target){ int rows = arr.length; int columns = arr[0].length; int row = 0…
错误重点: 1. 传递vector参数时,如果调用函数改变了vector的内容,一定一定要&,传引用保持一致 旋转数组的最小数字:有重复数字情况,二分查找照样搞.情况考虑要周全,当a[mid]==a[l]==a[r]时,target在左右区间都可能出现,所以要枚举去搞,当a[mid]>a[r]在右边,当a[mid]<a[l]在左边,剩余为递增顺序,取左边. 矩形覆盖:找dp最优子结构啊,从小开始找规律,变成特殊的斐波那契了. 二进制中1的个数:上bitset啊,count啊.敲黑板,自…