![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
文章平均质量分 61
Wo们的征途是星辰大海
这个作者很懒,什么都没留下…
展开
-
面试题3:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样一个数组和一个整数,判断数组中是否含有该整数 public class Find { public static void main(String[] args) { int[][] a = new int[][]{ {1,2,8,9}, {原创 2015-08-30 15:37:49 · 370 阅读 · 0 评论 -
面试题19:二叉树镜像
题目:完成一个函数,输入一个二叉树,该函数输入它的镜像 思路:递归即可 public class MirrorRecursively { public static void mirrorRecursively(Node root){ if(root==null) return; Node temp = root.getLeft(); root.setLeft原创 2015-08-31 15:14:20 · 313 阅读 · 0 评论 -
面试题15:链表中倒数第K个节点
题目:输入一个链表,输出该链表倒数第K个节点的值 思路:两个指针扫一遍就行了 public class FindKthToTail { public static void main(String[] args) { Node[] nodes = new Node[10]; for(int i=0;i<10;i++){ nodes[i] = new Node(i);原创 2015-08-31 10:22:50 · 205 阅读 · 0 评论 -
面试题14:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数调整该数组中的数字的顺序,使得所有奇数位于数组的前半部门,偶数位于后半部门 思路:类似快排的思路 public class ReorderOddEven { public static void main(String[] args) { int[] a ={1,2,3,4,5,6,7,8}; reorderOddEven(a); Sys原创 2015-08-31 09:54:49 · 309 阅读 · 0 评论 -
面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的 思路:递归可解 public class Merge { public static Node merge(Node headA,Node headB){ if(headA==null) return headB; else if(headB==null) return原创 2015-08-31 11:29:38 · 263 阅读 · 0 评论 -
面试题20:顺时针打印矩形
题目:输入一个矩形,按照从外向里以顺时针的顺序依次打印出每个数字 思路:打印即可 public class PrintMatrixClockwisely { public static void main(String[] args) { int[][] a = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };原创 2015-09-01 15:52:20 · 413 阅读 · 0 评论 -
面试题:23从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印 思路:BFS public class PrintFromTopToBottom { public static void printFromTopToBottom(Node root){ if(root==null) return; Queue queue = new ArrayDequ原创 2015-09-01 16:57:27 · 266 阅读 · 0 评论 -
面试题25:二叉树中和为某一值得路径
题目:输入一颗二叉树和一个整数,打印出二叉树中节点值得和为输入整数的所有路径 分析:递归 public class FindPath { public static void findPath(Node root,int target,ArrayList toPrint,int now){ if(root==null) return; now = now+roo原创 2015-09-01 20:55:00 · 312 阅读 · 0 评论 -
面试题22:栈的压入弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,判断第二个序列是否在该栈的弹出序列,假设压入栈的所有数字均不相等 思路:用一个辅助栈即可 mport java.util.Stack; public class IsPopOrder { public static void main(String[] args) { int[] a= {1,2,3,4,5}; in原创 2015-09-01 16:24:52 · 270 阅读 · 0 评论 -
面试题21:包含min函数的栈
题目:定义栈的数据结构,在该类型中实现一个能够得到的栈的最小元素的min函数.在该栈中,调用min,push,pop都是O(1)的复杂度 import java.util.Stack; public class StackWithMin { private Stack dataStack; private Stack minStack; public StackWithMi原创 2015-09-01 16:03:23 · 253 阅读 · 0 评论 -
面试题24:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历结果,如果是则返回true,不是返回false,假设输入的数组的任意两个数字都不相同 思路:递归 public class VerifySequenceOfBST { public static boolean verifySequenceOfBST(int[] source,int start,int end){原创 2015-09-01 20:39:15 · 278 阅读 · 0 评论 -
面试题16:翻转链表
题目:定义一个函数,输入一个链表的头结点,反转链表并输出反转后的链表头结点 思路:三个指针,pre指向已经完成的链表头结点,middle指向要操作的结点,next指向没操作的节点 public class ReverseList { public static Node reverseList(Node head){ if(head==null) return nul原创 2015-08-31 11:12:43 · 283 阅读 · 0 评论 -
面试题13:在O(1)时间删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. public class DeleteNode { /* * 要求时间复杂度O(1),只要被删除节点不是最后一个都可以O(1) * 如果是最后一个,并且链表中不止一个节点,依旧需要O(n)的复杂度、 * 但是整体是O(1) * 这里头结点是无意义的. */ public s原创 2015-08-31 09:40:10 · 370 阅读 · 0 评论 -
面试题12:打印1到最大的n位数
题目:输入一个数字m,按顺序打印从1到最大的n位十进制. 思路:打印就行了,考虑大数问题,可以用字符数组模拟加法,也可以使用全排列 解法1:字符数组模拟加法 public class PrintToMaxOfNDight_1 { public static void print_1(int n){ if(n<0){ return; } char[] toP原创 2015-08-30 20:40:43 · 298 阅读 · 0 评论 -
面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点 分析:利用栈即可解决 import java.util.Stack; public class ReverseLinkedList { public static void main(String[] args) { Node[] nodes = new Node[10]; for(int i=0;i<10;i原创 2015-08-30 15:56:34 · 298 阅读 · 0 评论 -
面试题8:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的尾部,我们称之为数组的旋转,输入一个递增排序的数组的旋转,输出旋转数组的最小元素 思路:直接扫一遍O(n) 利用二分搜索的思想O(logn)->这种搜索对特例要特殊处理 public class GetMin { public static void main(String[] args) { int[]a ={1,0,1,1,原创 2015-08-30 19:29:27 · 222 阅读 · 0 评论 -
面试题11:数值的整数次方
题目:实现函数double Power(double base,int exponent)求base得exponent次方 分析:正常算,考虑负数情况. public class Power { public static double power(double base,int exponent){ double result = 1; if(exponent>0){原创 2015-08-30 20:13:57 · 262 阅读 · 0 评论 -
面试题2:实现一个Singleton模式
public class Singleton { //内部持有Singleton唯一引用 private static Singleton instance; //构造器私有化,防止外部new对象 private Singleton(){} //利用锁加双重判断生成单例对象实例,并返回 public static Singleton getInstance(){ if原创 2015-08-30 15:21:01 · 378 阅读 · 0 评论 -
面试题9:斐波那契数列
题目:对一个函数n,求斐波那契数列的第n项. 思路:直接递归重复计算很多,直接循环就可以解 public class Fibonacci { public static void main(String[] args) { for(int i=0;i<50;i++) System.out.println(fibonacci(i)); } public static lo原创 2015-08-30 19:37:11 · 291 阅读 · 0 评论 -
面试题4:替换空格
题目:实现一个函数,把字符串中的每个空格替换成"%20" public class ReplaceBlank { public static void main(String[] args) { System.out.println(toAns("We are Happy")); System.out.println(toAns("We are Hap ")); Sys原创 2015-08-30 15:48:05 · 294 阅读 · 0 评论 -
面试题10:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制补码表示中1的个数 分析:位运算,扫一遍二进制字符串两种都可以 public class NumberOf1 { public static void main(String[] args) { System.out.println(numberOf1_1(9)); System.out.println(numberOf1_原创 2015-08-30 19:52:37 · 234 阅读 · 0 评论 -
面试题18:树的子结构
题目:输入两棵二叉树A,B判断B是不是A的子结构. 思路:递归遍历A,找到节点相同点后,再递归查看即可 public class HasSubTree { public static boolean hasSubTree(Node p,Node c){ boolean ans = false; if(p!=null && c!=null){ if(p.getDa原创 2015-08-31 14:47:07 · 284 阅读 · 0 评论 -
面试题6:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 思路:递归即可 public class BuildTree { public static void main(String[] args) { int[] first = {1,2,4,7,3,5,6,8}; int[] middle = {4,7,2,1,5,3,8,6}; Node root =原创 2015-08-30 16:22:33 · 278 阅读 · 0 评论 -
面试题7:用两个栈实现队列
题目:用两个栈实现一个队列.实现两个函数:appendTail和deleteHead 思路:画图分析一下即可 import java.util.Stack; public class Stack2Queue { private Stack s1; private Stack s2; private int size; public Stack2Queue() {原创 2015-08-30 16:31:59 · 282 阅读 · 0 评论 -
面试题26:复杂链表复制
题目:实现一个函数,复制一个复杂链表,复杂链表中,每个节点除了有一个next指针指向下一个节点外,还有一个sibling指针指向链表中的任意节点或null节点 import java.util.HashMap; import java.util.Map; public class Clone { public static Node clone(Node head){原创 2015-09-01 21:12:39 · 269 阅读 · 0 评论