
剑指offer
jim_cainiaoxiaolang
我热爱大数据开发,希望大家多交流
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【面试题1】赋值运算符函数
1.题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CmyString{public: CMyString(char* pData=NULL); CMyString(const CMyString& str); ~CMyString(void);private:原创 2017-03-02 17:13:22 · 192 阅读 · 0 评论 -
【面试题16】反转链表
题目:输入一个链表,反转链表后,输出链表的所有元素。分析:反转链表只需改变链接方向,改变方向时需要将原本指向后一个结点的链接方向指向前一个结点,因此需要记录下三个结点。实现:(非递归)public ListNode ReverseList(ListNode head) { ListNode cur = head; ListNode原创 2017-06-12 10:31:57 · 265 阅读 · 0 评论 -
【面试题17】合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。递归实现:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/pu原创 2017-06-12 16:17:10 · 241 阅读 · 0 评论 -
【面试题18】树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this原创 2017-06-12 16:36:37 · 274 阅读 · 0 评论 -
【面试题19】二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5原创 2017-06-12 16:55:08 · 247 阅读 · 0 评论 -
【面试题20】顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.原创 2017-06-12 19:31:03 · 282 阅读 · 0 评论 -
【面试题21】包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路:用一个栈data保存数据,用另外一个栈min保存依次入栈最小的数比如,data中依次入栈,5, 4, 3,8, 10,11, 12,1 则min依次入栈,5, 4, 3,no,no, no, no,1 no代表此次不如栈每次入栈的时候,如果入栈的元素比mi原创 2017-06-13 12:28:54 · 230 阅读 · 0 评论 -
【面试题22】二叉搜索树的后序遍历
程序员的一生时间90%是用在编程上,而剩余的10%是活在世界上。题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。import java.util.*;public class Solution { public boolean VerifySquenceOfB原创 2017-06-13 14:12:23 · 253 阅读 · 0 评论 -
【面试题23】二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。public class Solution { privateArrayList> listAll = newArrayList>(); privateArrayList list = newAr原创 2017-06-13 15:27:45 · 297 阅读 · 0 评论 -
【面试题24】复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)/*public class RandomListNode { int label; RandomListNode next = null原创 2017-06-13 17:02:35 · 319 阅读 · 0 评论 -
【面试题25】二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。引言 自己觉得对二叉树了解的不是很多,所以想专门练习一下这方面的问题,剑指Offer中有一道题是将二叉搜索树转换为双向链表,开始的时候照着书上的思路去做,最后发现问题很多,看来这本书也有很多问题啊,原因是Java和C++还是有很多不同的,特别是对对象的引用原创 2017-06-13 19:49:20 · 348 阅读 · 0 评论 -
【面试题25】字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印由字符a,b,c所能排列出来的所有字符串:abc,abc,bac,bca,cab,cba我们求整个字符串的排列,可以看成两步:首先求出所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。下图就是分别把第一个字符a和后面的b,c交换的情景。第二步固定第一个字符,求后面所有字符的排列。这个时候我们原创 2017-06-13 20:11:37 · 364 阅读 · 0 评论 -
【面试题15】链表中倒数第K个结点
题目:链表的倒数第k个节点题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。 链表的节点定义如下,这里使用的是C#来定义: public class Node {原创 2017-06-12 10:15:00 · 386 阅读 · 0 评论 -
【面试题4】替换空格
题目:请实现一个函数,把字符串中的每个空格替换成”%20“。例如,输入“We are happy”,则输出”We%20are%20happy”。void ReplaceBlank(char string[],int length){ if(string==NULL||length<=0) return; /*originalLength为字符串string的实际长度*/ in原创 2017-03-07 20:31:23 · 244 阅读 · 0 评论 -
【面试题3】二维数组的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该函数。总结查找过程如下:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说,如果要查找的数字不原创 2017-03-06 20:30:25 · 346 阅读 · 0 评论 -
【面试题5】从尾到头打印链表
链表的创建,插入结点,删除结点等操作都只需要20行左右的代码来实现。 链表是一种动态数据结构,因为在创建链表的时候,无须知道链表的长度。当插入一个结点的时候,只需要为新结点分配内存,然后调整指针的指向来确保新结点被链接到链表当中。内存分配不是在创建链表的时候一次完成的,而是每添加一个结点分配一次内存。 如果单向链表的结点定义如下:struct ListNode{ int m_nValue原创 2017-03-08 14:04:19 · 256 阅读 · 0 评论 -
【面试题6】重建二叉树
二叉树中最重要的操作莫过于遍历,即按照某一顺序访问树中的所有结点。以下这三种遍历都有递归和循环两种实现方法,每一种遍历的递归都要比循环实现简洁地多。前序遍历:前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 递归实现:void PreOrder(BTNode *b){ if(b!=NULL) { prin原创 2017-03-09 09:40:03 · 214 阅读 · 0 评论 -
【面试题7】用两个栈实现队列
栈和队列 操作系统会给每个系统创建一个栈用来存储函数调用时各个函数的参数,返回地址及临时变量等。栈的特点是后进先出,即最后被压入(push)栈的元素会被第一个弹出(pop)。 题目: 用两个栈实现一个队列。 队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队尾部插入结点和在队头部删除结点的功能。队列声明:template <typename原创 2017-03-10 09:00:50 · 250 阅读 · 0 评论 -
【面试题8】旋转数组的最小数字
查找和排序在程序设计中是经常用到的算法。查找相对而言比较简单,不外乎顺序查找,二分查找,哈希表查找和二叉排序树查找。不管是用循环还是递归,面试官都希望应聘者能够信手拈来写出完整的二分查找代码,“面试题8:旋转数组的最小数字”和“面试题38:数字在排序数组中出现的次数”都可以用二分查找算法来解决。 提示: 如果要求在排序的数组(或者部分排序的数组)中查找一个数字或者统计某个数字出现的次数,我原创 2017-03-11 20:04:27 · 483 阅读 · 0 评论 -
【面试题9】斐波那契数列
如果我们需要多次计算相同的问题,通常可以选择使用递归或者循环两种不同的方法。递归是在一个函数的内部调用这个函数自身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。题目1:写一个函数,输入n,求斐波那契数列的第n项。 斐波那契数列的定义如下: f(n)=0,n=0; f(n)=1,n=1; f(n)=f(n-1)+f(n-2),n>1效率很低的解法:long long Fib原创 2017-03-12 10:48:18 · 257 阅读 · 0 评论 -
【面试题11】数值的整数次方
1.代码的规范性 清晰的书写,清晰的布局,合理的命名 2.代码的完整性 检查代码是否完成了基本功能,输入边界值是否能得到正确的输出,是否对各种不规范的非法输入做出了合理的错误判断 1)从3方面保证代码的完整性 功能测试,边界测试,负面测试 2)3种错误的处理方法 第一种方式是函数用返回值来告知调用者是否出错; 第二种方式是当发生错误时设置一个全局变量; 第三者方式是异常。题目:数值原创 2017-03-23 14:33:38 · 206 阅读 · 0 评论 -
【面试题12】打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999.题目陷阱:大数问题在字符串上模拟数字加法的解法:void Print1ToMaxOfNdigits(int n){ if(n<=0) return ; char *number=new char[n+1]; memset(number,'0',n原创 2017-03-24 14:59:07 · 245 阅读 · 0 评论 -
【面试题13】在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);void DeleteNode(ListNode**原创 2017-03-25 07:49:39 · 300 阅读 · 0 评论 -
【面试题10】二进制中1的个数
位运算二进制的位运算并不是很难掌握,因为位运算总共只有5种运算:与,或,异或,左移和右移。 左移运算符m《n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。比如: 00001010《2=00101000 10001010《3=01010000 右移运算符m》n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移时处理最左边位的情形要稍微复杂一点。如果原创 2017-03-16 20:53:43 · 241 阅读 · 0 评论 -
【面试题14】调整数组顺序使基数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。void ReorderOddEven(int *pData,unsigned int length){ if(pData==NULL||length==0) return; int *pBegin=pData; int *pEnd=pData+l原创 2017-04-06 18:54:14 · 369 阅读 · 0 评论 -
【面试题2】实现Singleton模式
题目:设计一个雷,我们只能生成该类的一个实例。只能生成一个实例的类是实现了Singleton(单例)模式的类型。由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题。在常用的设计模式中,Singleton是唯一一个能够用短短几十行代码完整实现的模式。因此,写一个Singleton的类型是一个很常见的面试题。一、最简单的原创 2017-03-03 08:19:29 · 400 阅读 · 0 评论 -
【面试题26】数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。import java.util.Arrays;public class Solution { publicin原创 2017-06-15 10:31:21 · 331 阅读 · 0 评论