随笔分类 -  剑指Offer

摘要:题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出"student. a am I".思路:这是一道常见的面试题,思路分两步:1、翻转句子中的所有字符;2、翻转句子中每一个单词;代码:... 阅读全文
posted @ 2015-07-28 15:55 AndyJee 阅读(365) 评论(0) 推荐(0)
摘要:题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1-5,,4-6和7-8.思路:题目求的是连续正数序列,而且至少含有两个数,那么我们可以从1,2这两个数开始,以求和为9的所有连续序列为例... 阅读全文
posted @ 2015-07-28 12:57 AndyJee 阅读(1524) 评论(0) 推荐(0)
摘要:题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可。思路:1、枚举固定一个数字,然后依次判断数组中该数字后面的数字与它的和是不是等于s。时间复杂度:O(n^2)2、前后遍历利用排序数组的规律,定义两个指针,分别指向数组的首尾... 阅读全文
posted @ 2015-07-28 10:57 AndyJee 阅读(1158) 评论(0) 推荐(0)
摘要:题目:输入一课二叉树的根结点,判断该树是不是平衡二叉树。如果二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路:1、重复遍历结点参考上一题求二叉树的深度,先求出根结点的左右子树的深度,然后判断它们的深度相差不超过1,如果否,则不是一棵二叉树;如果是,再用同样的方法分别判断左... 阅读全文
posted @ 2015-07-26 21:26 AndyJee 阅读(2184) 评论(0) 推荐(0)
摘要:题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。结点的定义如下:struct TreeNode{ int val; TreeNode* left; TreeNode* right;};思路:对于树的问题基... 阅读全文
posted @ 2015-07-26 20:26 AndyJee 阅读(424) 评论(0) 推荐(0)
摘要:题目:统计一个数字在排序数组中出现的次数。思路:1、顺序遍历顺序扫描一遍数组,统计该数字出现的次数。时间复杂度:O(n)2、二分查找假设我们需要找的数字是k,那么就需要找到数组中的第一个k和最后一个k出现的位置。如何通过二分查找得到第一个k的位置呢?取数组中间的数字与k作比较,如果该数字比k大,那么... 阅读全文
posted @ 2015-07-26 18:16 AndyJee 阅读(2253) 评论(0) 推荐(0)
摘要:题目:输入两个链表,找出它们的第一个公共结点。链表结点的定义如下:struct ListNode{ int val; ListNode* next; ListNode(int x):val(x),next(NULL){};};思路:1、暴力法遍历第一个链表,每遍历到一个结点,在第二... 阅读全文
posted @ 2015-07-26 15:37 AndyJee 阅读(616) 评论(0) 推荐(0)
摘要:题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路:1、顺序扫描顺序扫描整个数组,每扫描到一个数字,就将该数字跟后面的数字比较,如果大于的话,则这两个数字构成了逆序对。(比较简单,这里就不贴出代码)时间复杂度:O(n... 阅读全文
posted @ 2015-07-26 11:41 AndyJee 阅读(930) 评论(0) 推荐(0)
摘要:题目:在字符串中找出第一个只出现1次的字符,如输入“abaccdeff”,则输出b。思路:1、暴力遍历从头开始扫描字符串中的每个字符,当访问某个字符时,取该字符与后面的每个字符相比较,如果没有重复的字符,那么该字符就是第一个只出现一次的字符。时间复杂度:O(n^2)2、Hash通过hash表来记录字... 阅读全文
posted @ 2015-07-25 20:36 AndyJee 阅读(813) 评论(0) 推荐(0)
摘要:题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:1、逐个判断逐个判断每个整数是不是丑数。根据丑数的定义,丑数只能被2,3,5整除,也就是说,如果一个数能被2整... 阅读全文
posted @ 2015-07-25 18:11 AndyJee 阅读(696) 评论(0) 推荐(0)
摘要:题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:1、全排列求出数组中所有数字的全排列,然后把每个全排列拼起来,求出拼出来的数字的最大值。2、定义新的排序规则如果... 阅读全文
posted @ 2015-07-25 15:36 AndyJee 阅读(2468) 评论(0) 推荐(0)
摘要:题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,一共出现了5次。思路:1、累加法累加1到n中每个整数1出现的次数。求每个整数1出现的个数:通过对10求余数,判断整数的个位是否为1,如果商不为0,则继续除以10... 阅读全文
posted @ 2015-07-25 11:21 AndyJee 阅读(1466) 评论(0) 推荐(0)
摘要:题目:输入一个整型数组,数组里有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n)思路:1、数组累加从头到尾逐个累加数组中的每个数字,当累加之和小于0时,从下一个元素开始累加,并通过一个变量保存最大和。2、动态规划思路与1一样,假设f(i)为以第... 阅读全文
posted @ 2015-07-25 09:53 AndyJee 阅读(570) 评论(0) 推荐(0)
摘要:题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:1、排序把输入的n个整数排序,然后取前k个数;时间复杂度:O(nlogn)2、Partition通过partition找到第k大的数,它的左边就是前k小的数;时间复杂... 阅读全文
posted @ 2015-07-24 11:09 AndyJee 阅读(809) 评论(0) 推荐(0)
摘要:题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路:1、方法1:先排序,然后找中位数;时间复杂度O(nlogn)2、方法2:基于Partition函数... 阅读全文
posted @ 2015-07-20 18:53 AndyJee 阅读(858) 评论(0) 推荐(0)
摘要:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路:把一个字符串看成两部分组成:第一部分为第一个字符,第二部分为后面的所有字符。求整个字符串的排列,可以看出两步:首先求所有可... 阅读全文
posted @ 2015-07-17 19:28 AndyJee 阅读(6459) 评论(0) 推荐(0)
摘要:题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二叉树的定义如下:struct TreeNode{ int val; TreeNode* left; TreeNode* right;};思路:在二叉树中,每个结... 阅读全文
posted @ 2015-07-17 16:42 AndyJee 阅读(543) 评论(0) 推荐(0)
摘要:题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个pNext指针指向下一个结点之外,还有一个pSibling指向链表中的任意结点或者NULL。结点的定义如下:struct ComplexLi... 阅读全文
posted @ 2015-07-17 15:03 AndyJee 阅读(5519) 评论(0) 推荐(0)
摘要:题目:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思路:根据二叉搜索树的后序遍历特点,很容易可以判断该数组是否为后序遍历的结果。在二叉搜索树的后序遍历序列中,最后一个数字是树的根节点的值,数组中前... 阅读全文
posted @ 2015-07-16 16:22 AndyJee 阅读(460) 评论(0) 推荐(0)
摘要:题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:很明显,这是一个广度优先遍历。需要一个队列容器来保存结点,具体操作:1、将根结点压入队列中,并打印根结点;如果根结点有子结点,将左右子结点依次压入队列的尾部;2、如果队列不为空,从队列头部取出结点,重复步骤1,直至队列为空。推广:不管... 阅读全文
posted @ 2015-07-16 15:04 AndyJee 阅读(384) 评论(0) 推荐(0)