剑指offer算法编程题目部分汇总(解法略)

总结一下本书中遇到的大部分面试题。面试题3:二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个整数,判断数组中是否含有该整数。

面试题4:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成%20。

面试题5:从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印每个结点的值。

面试题6:重建二叉树

题目:输入某二叉树前序遍历和中序遍历的结果,请重建出该二叉树。假设节点没有重复的。

面试题7:用两个栈实现队列

题目描述:如题。

面试题8:旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的一个旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小值。

面试题9:斐波那契数列及其相关应用

面试题10:二进制数中1的个数(如果是移位的话数为负数会死循环)(有惊喜解法)

面试题11:数值的整数次方(有陷阱)

面试题12:打印1到最大的n位数(用字符串打印)

面试题13:在O(1)时间内删除链表节点

题目描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该节点

面试题14:调整数组顺序使技术位于偶数前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。(设计模式的抽象)

面试题15:链表中倒数第k个结点(陷阱)

面试题16:反转链表

面试题17:合并两个排序的链表

面试题18:树的子结构

题目:输入两棵二叉树A和B,判断B是不是A的子结构。

面试题19:二叉树的镜像(最好画图来,更直观)

面试题20:顺时针打印矩阵

面试题21:包含min函数的栈

面试题22:栈的压入弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入序列,第二个表示栈的弹出序列,请判断第二个序列是否为栈的弹出序列(假设栈中数字没有相同的)

面试题23:从上往下打印二叉树(入队列)

面试题24:二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历序列,是则返回true,否则返回false,假设输入的输入的任意两个数都不同。

面试题25:二叉树中和为某一值的路径

面试题26:复杂链表的复制

面试题27:二叉搜索树与双向链表

题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树种结点指针的指向

面试题28:字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。

面试题29:数组中出线次数超过一半的数字

面试题30:最小的k个数

面试题31:连续子数组的最大和

面试题32:从1到n整数中1出现的次数

面试题33:把数组排成最小的数

面试题34:丑数

面试题35:第一个只出现一次的字符(简易hash表)

面试题36:数组中的逆序对

面试题37:两个链表的第一个公共节点(压栈)

面试题38:数字在排序数组中出现的次数

面试题39:二叉树的深度

暂时先整理到这么多吧,有一些题目还是比较具有代表性的。

时间: 2024-08-18 16:14:49

剑指offer算法编程题目部分汇总(解法略)的相关文章

剑指offer算法总结

剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行,只不过这本书的算法多看了几遍多做了几遍多了点心得体会.于是想总结一下.如果有错误也希望能指出,谢谢. 具体代码可以参考我的GitHub仓库: https://github.com/h2pl/SwordToOffer 数论和数字规律 从1到n整数中1出现的次数 题目描述 求出1~13的整数中1出现的

《剑指offer》全部题目-含Java实现

陆续刷了好久,算是刷完了<剑指offer>,以下全部AC代码,不一定性能最优,如有错误或更好解答,请留言区指出,大家共同交流,谢谢~ 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public class Solution { public boolean Find(int target, int [][] array) { if(array == n

剑指offer—算法之位运算(二进制中1的个数)

位运算: 左移:m<<n将m左移n位,左移后低位补充0: 右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFFF),负数的边界值为(ox80000000,oxFFFFFFFF)) 题目一:请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数. 思路一:将二进制数i与1相与,判断是否为1,然后将tag=1左移一位得到tag=2,然后再与i相与,循环结束的条件是tag==0:该算法的时间复杂度为输入的i的位数.

剑指offer算法思想

3. 数组中重复的数字 算法步骤:遍历该数组nums,从第一个数字开始,判断 1)如果nums[i]和下标的值i一样,就跳到下一个数字 2)如果不一样,那么就判断,nums[i]是否等于nums[nums[i]],如果等于,输出该数字nums[下标值], 如果不等于,那么就调整nums[i]和nums[nums[i]]的顺序.继续重复1)和2) 4. 二维数组中的查找 算法步骤: 1)获取行数rows和列数cols 2)确定从第一行r和最后一列c开始,即从右上角开始 3)while循环,行数r<

剑指offer(61-66)编程题

61.请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先序.中序.后序.层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!). 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树. 初始: 1 public class Solution { 2

剑指offer(26-30)编程题

二叉搜索树与双向链表 字符串的排列 数组中出现次数超过一半的数字 最小的K个数 连续子数组的最大和 26.输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向 class Solution { public: //0:left 1: right TreeNode* doConvert(TreeNode* pRootOfTree, int leftOrRight) { if (pRootOfTree == nullptr) return

剑指offer算法_位运算求和

不用+,-,*,/运算求和,可以分成三步: 1.计算两个数字的异或值,相当于只计算每一位的和,不计算进位,得出结果sum: 2.计算两个数字的与值,相当于求出两个数字的进位,然后左移一位,相当于进位,得出结果jw: 3.求sum和jw的和,步骤与1,2相同,直到进位jw==0停止计算: 扩展: 不申请额外内存实现两个变量值得交换: 方法一: 通过异或来实现: a=a^b; b=a^b; a=a^b; 方法二: 通过加减运算实现: a=a+b; b=a-b; a=a-b;

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer解题思路锦集11-20题

又来更新剑指offer上的题目思路啦. 11.[二进制中1的个数] 题目:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. eg:NumberOf1(1)=1 NumberOf1(2)=0 NumberOf1(3)=2 NumberOf1(4)=1 NumberOf1(5)=2 NumberOf1(6)=2 NumberOf1(7)=3 思路:每次都将数字n的最后一位1反转成0,不断反转到这个数字变成0,然后我们统计反转了多少次,这样不就可以成功得到这个数字有多少位了吗? 难点: