随笔分类 - 剑指offer
摘要:题目:输入一个整型数组,数组里有正数也由负数。数组中一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},其最大的子数组为{3,10,-4,7,2},因此所有子数组的和的最大值为 18。应用动态规划法:...
阅读全文
摘要:题目:输入 n 个整数,找出其中最小的 k 个数。例如输入4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4。这道题最简单的思路莫过于把输入的 n 个整数排序,排序之后位于最前面的 k 个数就是最小的 k 个数。这种思路的时间复杂度显然是 O(n*lgN)。解法二...
阅读全文
摘要:题目:数组中一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为 9 的数组{1,2,3,2,2,2,5,4,2}。由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2. 这道题很多人都会想到对这个数组进行排序。那么在已排序的数组中,位于中间位置的数字就是超过数...
阅读全文
摘要:题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图 4.5 中的二叉树,则依次打印出 8、6、10、5、7、9、11。二叉树结点的定义如下:typedef struct Node{ int m_nValue; Node *m_pLeft; Node *m...
阅读全文
摘要:题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。(假设各个元素不等)解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列p...
阅读全文
摘要:题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。我们或许会想到在栈里添加一个成员变量存放最小的元素。具体思路为:每次压入一个新元素进栈的时候,如果该元素比当前最小的元素还要小,则更新最小元素。但是上述办法存...
阅读全文
摘要:题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图中的链表 1 和链表 2,则合并之后的升序链表如链表 3 所示。链表结点定义如下:typedef struct Node{ int m_nValue; struct Node *m_pNext;...
阅读全文
摘要:题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:typedef struct Node{ int m_nKey; struct Node Node *m_pNext;}ListNode, *pListNode;分析:为了正确地反转链表,需要...
阅读全文
摘要:题目:输入一个链表,输出该链表中倒数第 k 个结点。本题从 1 开始计数,即链表的尾结点为倒数第一个结点。例如一个链表有 6 个结点,从头结点开始它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个结点是值为 4 的结点。链表结点定义如下:typedef struct Node{ ...
阅读全文
摘要:题目:输入一个整数数组,实现一个函数来解决该数组中数字的位置,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。本题思路较为简单,我们只需维护两个指针:第一个指针pHead 初始化为数组的第一个元素,第二个指针pTail 初始化为数组的最后一个元素。根据题目要求:所有奇数位于数组的前半部分...
阅读全文
摘要:题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:typedef struct Node{ int m_nValue; struct Node *m_pNext;}ListNode, *pListNode;void DeleteNo...
阅读全文
摘要:题目:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入数字 3,则打印出 1、2、3 ··· 999(因为最大的 3 为数即为 999)。这个题目看似简单。最容易想到的办法就是先求出 n 位十进制数的最大值,然后利用for循环逐个打印出即可;代码如下: 1 // Print1To...
阅读全文
摘要:题目:写一个函数,输入 n,求斐波那契(Fibonaci)数列的第 n 项。斐波那契数列的定义如下:解法一、效率低下的递归解法代码如下: 1 // Fanbonacci.c 2 #include "stdio.h" 3 #include "stdlib.h" 4 5 long long Fabon...
阅读全文
摘要:题目:请实现一个函数,输入一个整数。输出该数二进制中 1 的个数。例如把 9 表示成二进制是 1001, 有 2 位是1.因此如果输入 9,该函数输出 2.此题考查的是二进制和位运算的基本面试题之一。题目不是很难。解法一:基本思路1、将该数字 i 和 1 做与运算,判断 i 的最低位是不是为 1。2...
阅读全文
摘要:题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为 1.解法一: 这道题最直观的解法就是遍历一遍数组,这样我们就能找到最小的元素。这种思路...
阅读全文
摘要:题目:用两个栈实现一个队列,队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。队列的声明如下:template class Queue{public: Queue(); ~Queue(); vo...
阅读全文
摘要:题目:输入某二叉树的前序遍历和中序遍历的结点,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。假设输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。二叉树结点的定义如下:typed...
阅读全文
摘要:题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。链表结点定义如下:typedef struct Node{ int m_nKey; struct Node *m_pNext; }ListNode, *pListNode;我们可能会想到把链表结点的指针反转过来,改变链表的方向...
阅读全文
摘要:题目:请实现一个函数,把字符串中的每个空格都替换成“%20”。例如输入“We are happy.”,则输出“We%are%20happy.”。在网络编程中,如果 URL 参数中含有特殊字符,如空格、'#'等,可能导致服务器无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。而转...
阅读全文
摘要:题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字 7,则返回 true;如果查找数字 5, 由于数组不含有该...
阅读全文