剑指offer
文章平均质量分 76
强二二
这个作者很懒,什么都没留下…
展开
-
剑指offer 算法 (分解让复杂问题简单)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。解析:分三步:第一步:cloneList(pHead);复制链表,每个节点后新连接一个复制的自己的节点,random先置空;第二步:connectRandom(pHead);依次给每个新节点的random连接第三步:return apartList(pHea原创 2015-08-22 18:12:19 · 346 阅读 · 0 评论 -
剑指offer 算法 (举例让抽象具体化)
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解析:从上往下遍历 root结点 左结点 右结点 每遍历一个依次存入队列 由队列的先进先出 依次便可逐层存结点入数组中/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2015-08-19 10:47:10 · 294 阅读 · 0 评论 -
剑指offer 算法 (举例让抽象具体化)
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min,push,pop的时间复杂度都是O(1)。解析:首先是一个栈,这个栈已经是最常见的那种,我们需要改造它使它能够在O(1)时间内返回最小元素,刚开始的思路是往栈里面添加一个元素放在stack的顶部,表示当前栈里面的最小元素,如果压入的元素比它小,那么更新它,并且将它pop出来,放在一个临时原创 2015-08-18 22:46:48 · 361 阅读 · 0 评论 -
剑指offer 算法 (画图让抽象问题形象化)
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *原创 2015-08-18 19:37:58 · 282 阅读 · 0 评论 -
剑指offer 算法 (代码的鲁棒性)
题目描述输入一个链表,输出该链表中倒数第k个结点。解析:p1,p2保持k-1的距离,当p1指向链表尾时,p2正好指向倒数第k个结点/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {pu原创 2015-08-18 11:00:48 · 1132 阅读 · 0 评论 -
剑指offer 算法 (递归与循环)
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。class Solution {public: int jumpFloor(int number) { if(number==1) return 1; if(number==2) return 2;原创 2015-08-15 15:00:51 · 587 阅读 · 0 评论 -
剑指offer 算法 (位运算)
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。class Solution {public: int NumberOf1(int n) { //方法一:(包含二进制负数不成立)n依次右移与1计数 int cnt=0; while(n) {原创 2015-08-17 16:11:30 · 315 阅读 · 0 评论 -
剑指offer 算法 (代码的完整性)
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。class Solution {public: double Power(double base, int exponent) { if(equal(exponent,0.0)&&(exponent<0))//base为零 系数为负数原创 2015-08-17 16:54:37 · 367 阅读 · 0 评论 -
剑指offer 算法(栈和队列 查找和排序)
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解析:用栈来模拟队列。我们首先插入一个元素a到stack1中,再压入两个元素bc,此时栈中有元素abc,其中c位于栈顶,而stack2仍然为空。我们试着删除一个元素。按照队列先进先出的原则,我们应该先删除元素a。元素a存放在stack1中且不在栈顶,因此不能直接删除。注意到stack2还未使用,原创 2015-08-16 20:41:49 · 434 阅读 · 0 评论 -
剑指offer 算法 (综合)
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。解析:现在才发现,原来字符串转数字特蛋疼,很多细节,以前从来就没考虑过,鲁棒性啊!!! 首先,得定义个标志位LegitimateInput,表示串str是否为合法输入,初始化为1:合法输入。开始判断啦~~~若str空串,直接LegitimateInput置0,return 0退出;不是空串,那么,开始分析每个原创 2015-08-31 18:51:30 · 867 阅读 · 0 评论 -
剑指offer 算法(链表 树)
题目描述输入一个链表,从尾到头打印链表每个节点的值。解析:逆转链表,与栈顺序一致,可以用辅助栈解决这个问题。/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {*原创 2015-08-16 15:44:17 · 242 阅读 · 0 评论 -
剑指offer 算法 (发散思维能力)
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解析:短路求值原理class Solution {public: int Sum_Solution(int n) { int ans = n; ans && (ans += Sum_Solutio原创 2015-08-31 11:13:03 · 307 阅读 · 0 评论 -
剑指offer 算法 (抽象建模能力)
题目描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为S,输入n,打印出S的所有可能的值出现的概率。解析:用两个数组来存储骰子点数的每一个总数出现的次数。在一个循环中,第一个数组中的第n个数字表示骰子和为n出现的次数,在下一次循环中,我们加上一个新的骰子,此时和为n的骰子出现的次数应该等于上一次循环中骰子点数和为n-1、n-2、n-3、n-4、n-5与n-6的次数的总和,所以我们把另原创 2015-08-30 21:12:38 · 348 阅读 · 0 评论 -
剑指offer 算法(数组 字符串)
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解析:解题思路:从二维数组的右上角的元素开始判断,因为此元素是它所在行的最大数,是它所在的列的最小数。如果它等于要查找的数字,则查找过程结束。如果它大于要查找的数字,则可以排除它所在的列。如果它小于要查找的数字,则原创 2015-08-15 19:28:45 · 308 阅读 · 0 评论 -
剑指offer 算法 (知识迁移能力2)
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出。解析:两个指针,p1指向数组首,p2指向数组尾,判断两指针数据累加和,每当累加合为S则存入vector>vv数组,并保存乘积最小的乘积以及数组下标,累加和小于S则右移p1,大于S则左移p2,原创 2015-08-26 21:26:53 · 315 阅读 · 0 评论 -
剑指offer 算法 (知识迁移能力)
题目描述统计一个数字在排序数组中出现的次数。解析:采用二分查找,搜到数字后在其前后判断并计数class Solution {public: int GetNumberOfK(vector data ,int k) { int length=data.size(); if(length <= 0) return 0原创 2015-08-26 10:57:42 · 278 阅读 · 0 评论 -
剑指offer 算法 (时间空间效率的平衡)
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解析:根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3或者5得到的。那关键就是确保数组里的原创 2015-08-25 20:48:53 · 433 阅读 · 0 评论 -
剑指offer 算法 (时间效率)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。解析:保存数组首个数字,计数值置一,然后遍历整个数组。遇到相同的数组,计数值加一,遇到不同的数字,计数值减一,当计数值减到零时,用当前数组数字替换保存的数字,再继续进行比较,以此类推,比较直原创 2015-08-24 16:18:57 · 424 阅读 · 0 评论 -
剑指offer 算法(树的两个节点的最低祖先)
解析:先序遍历树,用两个链表保存遍历所走的路径,再求两个链表的最低公共结点#include #include #include using namespace std;typedef struct node{ char var; struct node* lTree; struct node* rTree;}Tree;Tree* create(void){ cha原创 2015-09-08 17:17:20 · 269 阅读 · 0 评论