
剑指offer
niexianglin_csdn
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
面试题2:实现Singleton
饿汉式原创 2015-08-09 22:02:58 · 308 阅读 · 0 评论 -
面试题 16
1 题目描述定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。2 解题方法头结点:不属于链表中有效的元素,为了方便操作而设立的一个节点 运用头插法将链表重写插入到头结点 具体操作如下所示: 3 C 语言实现#include<stdio.h>typedef int ElemType;typedef struct node{ ElemType dat原创 2015-09-07 15:11:22 · 265 阅读 · 0 评论 -
面试题 12
1 题目描述题目:输入数字 n, 按顺序打印从 1 到 最大位 n 位十进制数。 比如输入 3 打印 1,2,3 一直打印到 9992 解法描述1 乍看之下的解法public static void print12Max(int n){ int result=1; int i; if(n<=0) return; for(i=0;i<n;i++){原创 2015-09-07 10:06:38 · 247 阅读 · 0 评论 -
面试题 13
1 题目描述给定单向链表的都指针和一个节点指针,定义一个函数在 O(1)的时间内删除该节点。2 解法描述常规情况下,需要遍历整个链表,找到待删节点的前驱节点,然后将前驱节点的 next 指针指向待删节点的 next 指针指向的位置。时间复杂度为 O(n)O(1) 时间复杂度解法,待删节点复制其后继节点的值,然后将后继节点删掉。3 解法 2 实现 一般情况:待删节点位于链表的中间位置原创 2015-09-07 11:30:28 · 404 阅读 · 0 评论 -
面试题 11
1 题目描述题目:实现函数 double Power(double base,int exponent),求exponent 次方,不得使用库函数,同时不考虑大数问题。算法描述base^exponent 一般情况 base>=0 exponent>=0 特殊情况 base=0 exponent<0 此时计算需要进行 /0 操作,导致错误 特殊情况 base=0 exponent=0,0^0原创 2015-09-06 10:56:10 · 272 阅读 · 0 评论 -
面试题 14
1 题目描述输入一个数组,实现一个函数来调整数组中数字的顺序,使得所有的奇数位于数组的前面,所有偶数位于数组的后半部分。2 算法描述设置一个头指针和一个尾指针,头指针不断向后移动,直到遇到偶数,尾指针不断向前移动,直到遇到奇数,交换头指针和尾指针的数据,继续循环上述操作,直达头指针与尾指针交错。这个算法有点像快速排序中 partition 操作3 c 语言实现#include<stdio.h>vo原创 2015-09-07 13:46:25 · 307 阅读 · 0 评论 -
面试题 15
1 题目描述输入一个链表,输出链表中倒数第 k 个结点。链表的尾结点是倒数第一个结点。例如一个链表有 6 个结点,从头到尾开始他们的值依次是 1、2、3、4、5、6。那么倒数第三个节点的值是 4 。2 解法描述常规方法:遍历整个链表计算链表的长度,倒数第 n 个结点,也就是整数第 n-i+1。需要遍历链表两次其他解法:设立两个指针,初始化时同时指向链表中的第一个元素,接下来 head 指针单独向原创 2015-09-07 14:15:44 · 295 阅读 · 0 评论 -
面试题 19
1 题目描述请输入一个函数,输入一个二叉树,该函数输出它的镜像2 算法描述遍历二叉树,交换(如果都存在)左右孩子节点可以选择深度遍历、层次遍历3 C 语言实现采用先序递归遍历采用先序非递归遍历#include<stdio.h>// Treetypedef int ElemType;typedef struct node{ ElemType data; struct n原创 2015-09-08 09:44:48 · 427 阅读 · 0 评论 -
面试题 17
1 题目描述合并两个有序链表2 解法描述链表合并过程如下:从合并两个链表的首结点开始,两个链表中的值较小的首节点最为合并后链表的首节点,两个链表剩余的节点依然是排序的,合并步骤和之前合并首节点是一致的,是典型的递归过程。3 c 语言实现#include<stdio.h>typedef int ElemType;typedef struct node{ ElemType data;原创 2015-09-07 16:25:36 · 324 阅读 · 0 评论 -
Servlet 与 JSP 核心编程
阅读书目,清华大学出版社 《Servlet 与 JSP 核心编程》第二版Marty Hall Larry Brown著 记录读书体会,笔记内容掺杂个人理解,必定会有大量不妥甚至不对的地方,随着知识的积累会不断修正错误之处1 原书第 7 页,知识点 JSP 文档不过是编写 Servlet 的另一种方式,JSP 页面会被翻译成 servlet,servlet 会被编译,在请求期间运行的就是原创 2015-09-10 10:05:49 · 1123 阅读 · 0 评论 -
面试题 29
1 题目描述数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字2 算法描述数组中有一个数组出现的次数超过了一半,如果把这个数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过一半的数字。有成熟的 O(n)算法可以得到数组中任意第 K 大的数字。 利用快速排序的 partition 方法,在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字都排在他的左边原创 2015-09-18 10:04:41 · 302 阅读 · 0 评论 -
面试题 30
1 题目描述输入 n 个整数,找出其中最小的 k 个数2 算法描述利用快速排序找到序列中排名为 k 的数字,其左边的数字均小于该数子。3 java实现public class GetLeastNumbers{ public static void main(String[] args) { getLeastNumbers(new int[]{1,2,3,3,2,3,3,0},原创 2015-09-18 10:32:37 · 308 阅读 · 0 评论 -
面试题 33
1 题目描述输入一个整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这 3 个数字能排成的最小数字 321323.2 算法描述 1 将 m 和 n 进行和合并,如 mn3 代码实现 javapublic class PrintMinNumber { public static void main(String[]原创 2015-09-18 15:04:18 · 329 阅读 · 0 评论 -
面试题 31
1 题目描述输入一个整数数组,数组里有证正数也有负数,数组中一个或连续的多个整数组成一个子数组,求所有数组的和的最大值。要求时间复杂度为O(n)2 算法描述{1,-2,3,10,-4,7,2,-5} => {3,10,-4,7,2}1+(-2)=(-1) 如果后面的元素加上 -1 的话,只会让总和减小,所以当总和小于等于零的时候,我们需要抛弃之前所求得的和,从下一个元开始重新计算 3+10-原创 2015-09-18 13:56:47 · 307 阅读 · 0 评论 -
面试题 7
1 题目描述用两个栈实现一个队列,队列的声明如下,请事先它的两个函数,appendTail 和 deleteHead 分别完成从队列尾部插入节点和在对头部删除节点的功能。2 算法描述appendTail:元素进队时,直接入栈 Stack1 deleteHead : 若此时 Stack2 不为空,那么直接将 Stack2 栈顶元素出栈。若Stack2 为空,那么将 Stack1 中的元素依次出栈,然原创 2015-09-05 09:25:42 · 266 阅读 · 0 评论 -
面试题 9 Fibonacci数列
1 Fibonacci 数列的定义2 Fibonacci 解法递归计算 Fibonacci 数列int fibonacci(int n){ if(n<=0) return 0; if(n==1) return 1; return fibonacci(n-1)+fibonacci(n-2);}递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内原创 2015-09-05 12:35:54 · 457 阅读 · 0 评论 -
面试题5
1 题目描述输入一个链表的头指针,从尾到头反过来打印出每一个节点的值2 算法描述第一个遍历到的节点最后一个输出,而最后一个遍历到的节点第一个输出,典型的“后进先出”,可以用栈实现这种顺序。既然想到用栈来实现这个函数,而递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现。#include <stdio.h>typedef char datatype;typedef struct node原创 2015-08-11 08:51:20 · 578 阅读 · 0 评论 -
面试题3
1 题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。原创 2015-08-10 10:11:53 · 409 阅读 · 0 评论 -
面试题4
用 %20 替换字符串中的空格按照书中的算法,首先找到字符串中空格的数量,扩展字符串空间,然后在源字符串尾部设置一个标识head,在扩展后的字符床尾部设置一个标识last。若head处字符不等于空格,那么直接把该字符赋值给last,head、last同时向前移动一个位置;若head处字符等于空格,那么last处赋值为‘0’,last-1处赋值为‘2’,last-2处赋值为‘%’,head向前移动一个原创 2015-08-10 21:29:35 · 354 阅读 · 0 评论 -
面试题 18
1 题目描述输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。2 解法描述遍历二叉树 A 找到与二叉树 B 根节点相同的 A 的子树 a 。遍历子树 a 和 二叉树 B ,判断 a 和 B 是否存在一样结构的子树。3 C 语言实现#include<stdio.h>// Treetypedef char ElemType;typedef struct node{ Elem原创 2015-09-08 00:41:11 · 274 阅读 · 0 评论 -
面试题 20
1 题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。2 解法描述确定需要打印的圈如何打印每一圈设定每一圈的开始 row_start 和结束行 row_end,设定每一圈的开始 col_start 和结束列 col_end。如果以下逻辑判断成立,那么所有的圈已经打印完成!(col_start<=col_end&&row_start<=row_end)3 java 语言实现p原创 2015-09-08 11:57:44 · 283 阅读 · 0 评论 -
面试题 22
1 题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。2 解法描述 如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,把压栈序列中还没有入栈的数字压入辅助栈,直到拔下一个需要弹出的数字压入栈顶为止,如果所有的数字都压入了栈,仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列3 C 语原创 2015-09-09 14:01:53 · 276 阅读 · 0 评论 -
面试题6
1 题目描述根据先序序列和中序序列构建二叉树2 算法描述1 遍历先序序列,获得根节点 R 2 在中序序列中检索 R,确定 R 左子树与右子树的范围 3 递归上述过程C 语言实现#include<stdio.h>typedef int ElemType;typedef struct node{ ElemType data; struct node *lchild,*rchild原创 2015-09-04 14:59:53 · 451 阅读 · 0 评论 -
面试题 24
1 题目描述二叉搜索树的后续遍历序列:输入一个整数数组,判断数组是不是某二叉搜索树的后序遍历的结果,如果是则返回 true,否则返回 false,假设输入的数组的任意两个数字互不相同。2 解法描述二叉搜索树,父节点大于左孩子节点,小于右孩子节点后序遍历的最后一个节点为当前树的根节点将后序遍历序列与根节点进行比较,小于根节点的序列为左子树,大于根节点的序列为右子树。然后以同样方法递归左子树和右原创 2015-09-10 00:04:36 · 292 阅读 · 0 评论 -
面试题 23
1 题目描述从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。2 解法描述每一次打印一个结点的时候,如果该节点有子结点,那么把该节点的子结点放到一个队列的末尾。接下来从队列的头部取出最早进入队列的结点,重复前面的打印操作,直到队列中的所有结点都被打印出来为止。3 C语言实现#include<stdio.h>// Treetypedef char ElemType;typede原创 2015-09-09 14:13:58 · 331 阅读 · 0 评论 -
面试题 21
1 题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数,在该栈中,调用 min、push及pop 的时间复杂度是 O(1)。2 解法描述常规想法 - 往栈里添加一个成员变量保存最小的元素,每次压入一个元素的时候比较待压入元素与当前最小元素的大小,如果该元素比当前最小元素小,更新最小元素。(不可行,如果当前最小元素出栈,无法在 O(1)时间内找到下一个最小元素)。本原创 2015-09-09 09:57:10 · 303 阅读 · 0 评论 -
面试题 8
1 题目描述把一个数组最开的若干个元素搬到数组的尾部,我么称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。2 算法描述一般情况: 5 6 7 8 1 2 3 4 递增序列旋转后分成两个递增子序列,第一个递增序列所有元素大于第二个递增序列的元素,可以设置一个 head 指针始原创 2015-09-05 11:02:46 · 364 阅读 · 0 评论 -
面试题 10
1 题目描述计算数的二进制表示中的 1 的个数,例如把 9 表示成二进制是 1001,有 2 位是1.2 解决方法第一种方法:依次右移 n ,检查最右边一位是不是 1int numberOf1(int n){ int count=0; while(n){ if(n&1){ count++; } n=n>>1;原创 2015-09-05 15:28:53 · 262 阅读 · 0 评论 -
面试题 25
1 题目描述输入一颗二叉树和一个整数,打印出二叉树中节点值和为输入整数的所有路径。从输的根节点开始一直找到叶子节点所经过的节点形成一条路径。2 解法描述遍历二叉树的过程中累加二叉树元素累加之和,当当前遍历的节点为叶子节点时,判断累加值是否等于期望值,若等于打印当前路径并退回到其父节点继续遍历二叉树,否则直接退回到父节点继续遍历二叉树。使用递归的方式完成方法的返回,从子节点遍历上下文退回到父节点遍历上原创 2015-09-10 15:22:00 · 323 阅读 · 0 评论 -
面试题 56
1 题目描述一个链表中包含环,如何找出环的入口节点?例如下图的 3 结点即为入口节点2 算法描述找到环内的任何一个结合:利用两个指针(前指针和后指针),前指针一次性前进两步,后指针一次性前进一步,当前指针与后指针再次相遇时,那么说明次链表中必定存在环,而且相遇的节点必定在环里面。确定环内节点的数量:设定一个指针从上次得到的节点 A 开始移动,当指针再次移动到 A 时,说明指针已经在环立面绕了一圈原创 2015-09-26 11:32:21 · 351 阅读 · 0 评论