剑指offer
文章平均质量分 50
瓶子的罐子
这个作者很懒,什么都没留下…
展开
-
从尾到头打印单链表
public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> result = new ArrayList<>(); Stack<ListNode> stack = new Stack<>();原创 2017-09-03 23:08:06 · 232 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。输入:每个测试案例包括3行:第一行为1个整数n(1第二行包含n个整数,表示栈的压入顺序原创 2016-02-24 12:15:01 · 291 阅读 · 0 评论 -
包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数package 栈最小元素;import java.util.ArrayDeque;public class MinInStack extends ArrayDeque{ private static MinInStack m_data; private static MinInStack m_min原创 2016-02-23 21:21:23 · 252 阅读 · 0 评论 -
不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+,-,*,/四则运算符号。核心代码:具体分析参看《剑指offer》int Add(int num1, int num2){ int sum, carry; do { sum = num1 ^ num2; carry = (num1 & num2) << 1; num1 = suml; num2 =原创 2016-03-20 16:37:04 · 280 阅读 · 0 评论 -
扑克牌的顺子
题目描述:L今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12原创 2016-03-19 21:31:53 · 338 阅读 · 0 评论 -
字符串的全排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 方法一:不能避免重复#include using namespace std;void swap(char* x,char* y){ char tem原创 2016-03-07 15:19:08 · 325 阅读 · 0 评论 -
二叉搜索树与双向链表
问题描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。算法代码:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}BinaryTreeNode* Convert(Bin转载 2016-03-07 14:15:07 · 246 阅读 · 0 评论 -
复杂链表的复制
复杂链表不会创建,为了熟悉思想就从书中抠出来一些内容。题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。算法思想://复杂链表结构struct ComplexListNode{ int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_转载 2016-03-07 10:18:31 · 298 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。#include bool VerifySequenceOfBST(int sequence[], int length){ if(sequence == NULL || length<=0) return false; in原创 2016-03-06 20:39:02 · 346 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。数字中如果一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。代码实现:#include using namespace std原创 2016-03-10 09:28:16 · 286 阅读 · 0 评论 -
旋转数组的最小数字
题目描述: 把一个数组最开始的瓯柑个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转的数组的最小元素,例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1.考虑数组{1,0,1,1,1}和数组{1,1,1,0,1}都可以看成是递增数组{0,1,1,1,1}的旋转。这两种情况,第一个指针和第二个指针指向的数字都是1,并且两原创 2016-03-10 11:02:21 · 287 阅读 · 0 评论 -
java字符串翻转
问题描述:翻转一个字符串,并把小写变成大写 ,大写变成小写。代码实现:package leetcoder;import java.util.*;public class Solution1 { public static String trans(String s, int n) { if (s == null) return null; char[] ch = ne原创 2016-04-20 10:51:02 · 480 阅读 · 0 评论 -
数组中的逆序对
题目描述:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数组组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4)。解题思路看到这样的题目,最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是原创 2016-03-15 09:35:16 · 337 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述:在字符串中找出第一个只出现一次的字符,如输入“abaccdeff”,则输出“b”。解决办法:字符是一个长度为8的数据类型,因此共有256种可能,于是我们创建一个长度为256的数组,每个字母根据其ASCLL码值作为数组的下标对应数组的一个数字,而数组中存储的是每个字符出现的次数。这样我们就创建了一个大小为256,以字符ASCLL码作为键值的哈希表。代码实现:#inclu原创 2016-03-14 20:09:54 · 309 阅读 · 0 评论 -
丑数
题目描述:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数方法一:遍历法使用遍历法求第k个丑数,从1开始遍历,如果是丑数则count++,直到count==k为止。那么如何判断丑数呢?根据丑数的定义,丑数只有2,3,5这三个因子,那么我们就拿数转载 2016-03-10 20:35:35 · 390 阅读 · 0 评论 -
从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};class Solution {public:原创 2016-02-26 00:13:05 · 361 阅读 · 0 评论 -
把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为32132。代码实现:方法一:指针#include #include using namespace std;const int g_MaxNumberLength=10;char* g_StrCo原创 2016-03-10 17:26:14 · 258 阅读 · 0 评论 -
从1到n整数中1出现的次数
题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。具体分析 参照《剑指offer》代码实现:#include #include using原创 2016-03-10 16:21:15 · 357 阅读 · 0 评论 -
连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住代码实现原创 2016-03-10 11:44:37 · 286 阅读 · 0 评论 -
和为s的两个数字VS和为s的连续证正数序列
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。思路:最初我们找到数组的第一个数字和最后一个数字。首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)数字。当两原创 2016-03-16 21:28:09 · 472 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述:一个整型数组里出来两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:首先交待一下异或的基本性质:2个相同的数异或等于0,且异或操作(^)满足结合律和交换律。再来考虑一种简单一点的情况:一个数组中只有一个元素出现唯一的一次,而有其他元素都出现2次。那么我们用0依次异或数组中每一个元素,得到原创 2016-03-16 20:24:07 · 948 阅读 · 0 评论 -
判断平衡二叉树
题目描述:判断一棵树是不是平衡二叉树求二叉树深度:int TreeDepth(BTree pRoot){ if(pRoot == NULL) return 0; int left = TreeDepth(pRoot->lchild); int right = TreeDepth(pRoot->rchild); return left>right ? (left+1) : (r原创 2016-03-16 16:04:03 · 299 阅读 · 0 评论 -
从尾到头打印链表
#include #include struct LinkList{ int val; struct LinkList *next;};struct LinkList *Node;struct LinkList* creat_list(){ struct LinkList *head; struct LinkList *p,*q; int i, m; head = (Li原创 2015-11-23 21:16:18 · 373 阅读 · 0 评论 -
空格替换
/*题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。*/#include #include #include using namespace std;void replacespace(char string[], int length){ int blankn原创 2015-11-23 21:20:31 · 381 阅读 · 0 评论 -
青蛙跳台阶
问题:1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。2)一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 分析思路(1)1)当n=1时,只有一种跳法;2)当n=2时,有两种跳法;3)当n=3时,有3种跳法由数学归纳法可得如下递推公式:原创 2015-12-05 16:39:57 · 489 阅读 · 0 评论 -
合并两个排序的链表---递归实现
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。代码实现:#include #include typedef struct node{ int value; struct node *next;}LinkList;//创建带头结点的单链表void CreateList(LinkList *L){ in原创 2015-12-14 21:26:54 · 386 阅读 · 0 评论 -
顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 输入:输入可能包含多个测试样例,对于每个测试案例,转载 2015-12-29 20:41:33 · 328 阅读 · 0 评论 -
反转链表
题目描述:输入一个链表,反转链表后,输出链表的所有元素。思路:获得原链表的头结点,再利用头插法将结点依次插入到新的链表中。代码实现:#include #include typedef struct node{ int value; struct node *next;}LinkList;//创建带头结点的单链表void CreateList(LinkList原创 2015-12-14 11:53:55 · 310 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9原创 2015-12-28 22:09:56 · 292 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述:输入一个链表,输出该链表中倒数第k个结点思路一:要找倒数第K个结点,就是找正数第n-k+1个结点(结点从1开始编号)。由于要得到链表的长度,需要从头到尾的遍历单链表,统计结点个数。然后找倒数第n-k+1个结点又需要遍历一次单链表。时间复杂度为O(n);代码实现:#include #include typedef struct node{ int value; str原创 2015-12-13 13:27:11 · 276 阅读 · 0 评论 -
两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。输入:每个输入文件包含一个测试样例。对于每个测试样例,第一行输入一个n(1接下来的n行,每行输入一个队列操作:1. PUSH X 向队列中push一个整数x(x>=0)2. POP 从队列中pop一个数。输出:对应每个测试案例,打印所有pop操作中从队列pop中的数字原创 2015-12-05 17:05:26 · 331 阅读 · 0 评论 -
斐波拉契数列
问题描述;大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。从下往上计算,首先根据f(0)和f(1)算出f(2),在根据f(1)和f(2)算出f(3)……依此类推就可以算出第n项了。这种思路的时间复杂度是O(n)代码实现:#include int Fibonacci(int n){ int result[2] = {0,1}; i原创 2015-12-05 17:14:57 · 539 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目描述 :统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.解法:使用二分查找的方法分别找出给定数字的开始和结束位置,最坏情况下时间复杂度为O(logn)代码实现:#include #include //找到排序数组中的第一个Kint GetFirstK(int* data, i原创 2016-03-16 11:39:37 · 266 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述:输入两个链表,找出它们的第一个公共结点。方法一:分别把两个链表的结点放入两个栈中,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的结点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,知道找到最后一个不相同的结点。需要用到两个辅助栈,空间复杂度是O(m+n)时间复杂度也是O(m+n).方法二:首先遍历两个链表得到他们的长度,就能知道哪个链表比较长,以及长的链原创 2016-03-16 10:10:16 · 368 阅读 · 0 评论 -
数值的整数次方
详细说明参照文章:http://zhedahht.blog.163.com/blog/static/254111742009101563242535/下面给出java的具体实现:package day20;import java.util.Scanner;public class MyPower{ public static double PowerWithUnsignedExpon原创 2015-12-07 21:46:55 · 285 阅读 · 0 评论 -
树的子结构
详细讲解请参考《剑指offer》.题目描述:输入两颗二叉树A,B,判断B是不是A的子结构。代码实现:#include #include typedef struct TNode{ int value; TNode *lchild; TNode *rchild;}TNode,*BTree;BTree creat_tree(int preOrder[],int s原创 2015-12-25 12:43:43 · 302 阅读 · 0 评论 -
二进制中1的个数
思路一:首先a和1做与运算,判断a的最低位是不是为1。接着把1左移一位得到2,再和a做与运算,就能判断a的次高位是不是1……这样反复左移,每次都能判断a的其中一位是不是1思路二:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减去1,那么原来处在整数最右边的1就会变成0,原来在1后面的所有的0都会变成1。其余的所有位将不受到影响。举个例子:一个二进制数11原创 2015-12-07 13:43:01 · 366 阅读 · 0 评论 -
重建二叉树
/*输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。#include #include typedef struct TNode{ int value; TNode *lchild;原创 2015-12-05 16:51:45 · 309 阅读 · 0 评论 -
矩形覆盖
问题描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?代码实现:#include using namespace std;int rectCover(int n){ if(n < 1) { cout<<"error"<<endl; return -1; } i原创 2015-12-05 19:02:43 · 277 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:由旋转数组的特性知道 最小元素总是会出现在元素的后半部分。利用折半查找的思想,1.若a[low]2.若high - low == 1,则a[high]就原创 2015-12-05 17:19:46 · 420 阅读 · 0 评论