剑指Offer
heqianqiann
每一个不曾起舞的日子都是对生命的辜负
展开
-
剑指Offer 二叉树的镜像
题目描述: 请完成一个函数,输入一个二叉树,该函数输出它的镜像。思路: 遍历二叉树 如果当前节点存在左子树和右子树 那么将两个子树进行交换1) 递归实现package com.hqq.exercise.tree;/** * MirrorTree 二叉树的镜像 * 题目描述: * 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 * 思路: * 遍历两个二叉树 如果当前节点存在子节点原创 2017-08-13 18:48:55 · 425 阅读 · 0 评论 -
剑指Offer SnakeNumber 蛇形填数
题目描述: 在n*n的方阵里填入1,2..,n*n 要求填成蛇形例如n=4时方阵为:10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4思路: 首先蛇形填入数据,可以把操作分为四个步骤:从上往下,从右往左,从下往上,从左往右。 定义x,y表示元素在矩阵中的横纵坐标,首先循环从上往下给数组赋值,纵坐标y不变 横坐标x递增,直到横坐标达到矩阵的边界n-1结束。之后原创 2017-08-18 16:37:04 · 568 阅读 · 0 评论 -
剑指Offer LevelTraversalTree 层序遍历二叉树
题目描述:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。思路:1.循环+队列 每次扫描本层的所有节点放入队列 再从队头读取一个节点继续遍历子节点 public static void printByLoop(BinaryTreeNode root) { Queue<BinaryTreeNode> queue = new LinkedBlockingQueue原创 2017-08-21 13:52:59 · 865 阅读 · 0 评论 -
剑指Offer MergeOrderedList 合并两个排序的链表
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的思路: 递归扫描两个数组 每次将next指针指向连个链表中当前节点的较小值public static ListNode mergeOrderedList(ListNode list1, ListNode list2) { if (list1 == null){ return原创 2017-08-18 17:32:12 · 691 阅读 · 0 评论 -
剑指Offer ReverseList 反转列表
题目描述:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。递归实现/** * 递归实现链表反转 从尾部开始处理 */ public static ListNode reverseListByRecursion(ListNode head) { ListNode prev = null; if (head == nul原创 2017-08-18 17:27:52 · 762 阅读 · 0 评论 -
剑指Offer CalCarryBit 计算进位个数
题目描述:计算两个整数相加时需要进行多少次进位 假设输入的整数都不超过9个数字思路:使用一个变量carry保存进位,一个变量count保存相加次数,每次将两个数的个位进行相加,大于10则count自增,注意每次将数和10取余就可以取到个位的数方法一: public static int calCarryNum(int num1, int num2) { if (num1 ==原创 2017-08-18 17:25:56 · 1137 阅读 · 0 评论 -
剑指Offer AccurateFactorial 计算精确的阶乘
题目描述:输入不超过1000的正整数n,输入n!=1*2*3..*n的精确结果思路: 初步计算1000!大概是4*10^2567 所以基本数据类型是无法保存这么大的数的 我们可以考虑使用数组保存 同时为了防止进位产生溢出 我们倒序从低位到高位保存,即f[0]是个位 f[1]是十位 f[2]是百位..public class AccurateFactorial { private static原创 2017-08-18 17:20:22 · 807 阅读 · 0 评论 -
剑指Offer CountOneInBinary 计算二进制中1的个数
方法1:根据除2取余的方法判断1的个数原理:一个数除以2相当于右移一位 如果除的过程中有与 表示当前位置有一个1以10 100 010为例:第一次除以2 商是1 010 001 余数是0 第二次除以2 商是 101 000 余数是1代码实现: public static int countByDivide(int num) { int count = 0; whi原创 2017-07-10 08:27:10 · 421 阅读 · 0 评论 -
剑指Offer FindNumberMoreThanHalf 找出数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现次数【超过 不会等于】数组长度的一半,请找出这个数字思路: 先对数组进行排序,出现次数超过一半的数组元素一定是该数组的中位数 这里使用效率比较好的双指针快排 /** * 基于快排算法 */ public static int findNumberBySort(int[] array) { if (array == null原创 2017-08-18 17:05:32 · 761 阅读 · 0 评论 -
剑指Offer RotateArray 旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾 我们称之为数组的旋转 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素思路: 分析旋转数组的特点,例如{3,4,5,1,2},因为是旋转数组,因此不存在数组整个是递增序列。 最小元素的左边的是比它大的数且依次递增,右边同样的是比它大的递增序列,因此可以使用二分查找,三个指针分别指向首元素、尾元素和中间元素。 当中间元素大于数组首元素原创 2017-08-18 16:53:34 · 489 阅读 · 0 评论 -
剑指Offer TurnOnLight 开灯问题
题目描述:有n盏灯,编号1-n.第1个人把所有的灯打开,第2个人按下所有编号为2的倍数的开关,第3个人关掉3的倍数的开关 依次类推 一共k个人 问最后哪些灯开着 /** * 输出开着的灯编号[从1开始] * * @param n 灯的总数 * @param k 人的总数 */ public static void calTurnOnLigh原创 2017-08-18 16:40:21 · 671 阅读 · 0 评论 -
剑指Offer 调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组 实现一个函数来调整该函数数组中数字的顺序,使得所有的奇数位于数组的前半部分 所有的偶数位于数组的后半部分思路:想到类似快排的实现,从前往后扫描偶数,从后往前扫描奇数,交换二者顺序即可。public static void order(int[] number) { int startIndex = 0; int endIndex = num原创 2017-08-18 16:24:54 · 530 阅读 · 0 评论 -
剑指Offer 含有Min函数的栈
题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop德尔时间复杂度都是O(1)思路: 1. 在栈中定义一个标识最小变量的变量 每次入栈的时候进行比较判断 保证该变量保存的始终是入栈元素中的最小值 出现问题:如果该最小元素出栈? 2. 使用一个栈保存入栈的数据元素,再使用一个栈辅助保存最小值 以及定义一个变量表示当前还在栈中所原创 2017-08-13 20:11:11 · 287 阅读 · 0 评论 -
剑指Offer 最小的K个数
题目描述:输入n个整数,找出其中最小的k个数思路:首先想到的是对数组进行按从小到大排序然后再选出最小的前K个数。排序算法里选择排序是每次排序都可以确定数组在最后排好序数组的位置。 首先想到的是最简单的选择排序,由于只需要选出前K个最小的,因此只需要排序K趟即可 public static int[] getLeastNumberBySelectSort(int[] array, int n) {原创 2017-08-18 16:21:09 · 528 阅读 · 0 评论