SwordPointToOffer(18): 树的子结构 发表于 2017-01-29 | 分类于 SwordPointToOffer 题目输入两棵二叉树A和B,判断B是不是A的子结构。 分析整个判断过程分为两步: 在树A中查找与根节点的值一样的节点R,实际上是二叉树的遍历。 判断树A中以R为根节点的子树是不是和树B具有相同的结构。 实现1234567891011121314151617181920212223242526272 ... 阅读全文 »
SwordPointToOffer(17): 合并两个排序的链表 发表于 2017-01-29 | 分类于 SwordPointToOffer 题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。 分析合并链表的过程: 比较两个链表头节点的值大小,将较小的节点合并到新链表中; 递归完成所有比较 实现1234567891011121314151617181920212223242526public class ... 阅读全文 »
SwordPointToOffer(16): 反转链表 发表于 2017-01-29 | 分类于 SwordPointToOffer 题目定义一个函数,输入一个链表的头节点,反转该链表并返回反转后链表的头节点。 分析分析整个调整链表方向的过程,需要借助具体的例子来分析,例如原链表中的某一段h->i->j,当调整h<-i时,将i的next节点指向节点h,但是会导致i->j的断裂,所以需要保存这个引用。 实现1 ... 阅读全文 »
SwordPointToOffer(15): 链表中倒数第k个节点 发表于 2017-01-29 | 分类于 SwordPointToOffer 题目输入一个链表,输出该链表中倒数第k个节点。 分析思路1:先遍历一次链表,得到节点数n,然后遍历输出第(n-k+1)个节点。 思路2:只遍历一次链表,维护两个指针,一个从头开始计数,另一个指针也从头开始计数,只不过两个指针的距离保持在k-1,当第一个指针到达尾节点时,第二个指针就是倒数第k个节点。 ... 阅读全文 »
SwordPointToOffer(14): 调整数组顺序使奇数位于偶数前面 发表于 2017-01-29 | 分类于 SwordPointToOffer 题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 分析时间复杂度$O(n_2)$的思路:从前往后遍历,每遇到一个偶数时,拿出这个数字,并把位于该数字后面的所有数字往前移动一位,再将该数字插入到末尾的空位。 时间复杂度$O(n)$的 ... 阅读全文 »
SwordPointToOffer(13): 在 O(1) 时间删除链表节点 发表于 2017-01-29 题目给定单向链表的头指针和一个节点的指针,定义一个函数在O(1)时间删除该节点。 分析常规的做法是:从链表的头节点开始,顺序遍历查找到要删除的节点,并在链表中删除该节点。顺序查找使得时间复杂度是O(n)。 实现O(1)时间复杂度:使用复制覆盖的思想,将targetNode节点的next节点的值复制给 ... 阅读全文 »
SwordPointToOffer(12): 打印1到最大的n位数 发表于 2017-01-29 | 分类于 SwordPointToOffer 题目输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3,…,999。 分析问题:需要注意这个题目的陷阱,最大的n位数可能会造成数据类型(int 或 long)的溢出,所以这是一个大数问题,应该使用字符串或字符数组来解决。 有两种方法:首先定义一个长度为n的字符数组,默认 ... 阅读全文 »
SwordPointToOffer(11): 数值的整数次方 发表于 2017-01-27 | 分类于 SwordPointToOffer 题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 分析这个题目看似简单,但是有很多问题需要考虑。 边界问题 当底数base是0且指数是负数时,需要做特殊处理。 浮点型equal问题 计算机表示 ... 阅读全文 »
SwordPointToOffer(10): 二进制中1的个数 发表于 2017-01-26 | 分类于 SwordPointToOffer 题目输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 分析方法1:用标志位与数target进行按位与操作,如果不为0代表有一个1,循环比较,标志位左移1位。时间复杂度为O(n),n为二进制的位数。 方法2:将数target减1,然后与原数target进行按位与操作并更新target数 ... 阅读全文 »
SwordPointToOffer(9): Fibonacci 发表于 2017-01-26 拓展下面代码的时间复杂度是O(n),但是运用矩阵运算公式及乘方的性质可以达到O(logn)。 青蛙跳台阶问题:一只青蛙一次可以跳1级台阶,也可以跳2级台阶,求跳上n级台阶总共有多少种跳法。 n>2时,考虑第一次跳1级时,总共有f(n-1)种跳法;第一次跳2级时,总共有f(n-2)种跳法。 ... 阅读全文 »