
面试题
Qiana_Wu
坚持不懈的编程
展开
-
找出数组中出现次数超过一半的数字
题目:一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[] = {2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。解法一:数组中有一个数字出现的次数超过了数组长度的一半,如果把数组排序,排序之后位于数组中间的数字一定是出现次数超过数组长度一半的数字。排序算法可以使用sort(快排),它的时间复杂度为O(n*logn)。例如:{2,5,7,2,2原创 2018-01-26 22:26:20 · 4750 阅读 · 2 评论 -
二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针next。题目解析:给定一棵二叉查找树,注意参数部分传的是这个节点,而不是二叉树的根节点。查找中序遍历的下一个节点,如果该结点是最大的,则返回 NULL。其他的情况有以下的图解:AC代码:/*struct TreeLinkNode...原创 2018-08-14 00:02:46 · 536 阅读 · 0 评论 -
重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目解析:通过前序遍历的序列和中序遍历的序列,构建出二叉树,从前序遍历的特点可以看出,其序列的第一个节点是根节点,先是遍历完左子树,再进行遍历...原创 2018-08-13 23:55:44 · 279 阅读 · 0 评论 -
序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。题目解析:序列化:将一颗二叉树序列化,以前序遍历的顺序序列化,从根节点开始,将节点的值转换为字符,存入一个字符串中,每存一个值,再加上一个',' ,当遍历到空节点的时候,加上'#'。反序列化:将一个字符串还原为一个二叉树,将字符0-9转换为字符 (ch - '0')。转换为整型后,创建一个节点其值为该整型。再递归的调用左子树...原创 2018-08-15 20:51:49 · 231 阅读 · 0 评论 -
对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。题目解析:思路:从根节点开始,判断它的左子树和右子树是否相等,它们的值是否相等。再递归的判断左子树的左子树和右子树的右子树是否相等,左子树的右子树和右子树的左子树是否相等。AC代码:/*struct TreeNode { int val; ...原创 2018-08-15 10:35:12 · 257 阅读 · 0 评论 -
用两个栈实现队列
用两个栈实现队列:栈 是先进的后出来,队列是先进的先出来。入队列:直接push进stack1出队列:如果两个队列都为空就直接返回。如果stack2为空,就将stack1中的元素push进Stack2中,再对Stack2进行pop,此时就相当于pop了队列(入栈的一个元素)。如果stack2不为空,就直接pop stack2中的元素。AC代码:class Solution{...原创 2018-08-07 20:02:54 · 183 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题目解析:二叉搜索树使用中序遍历就是有序的,将二叉树转换成双向链表,就是要改变指针的指向。比如,作左子树的right = 根,根的left = 左子树,根的right = 右子树 ,右子树的left = 根。AC代码:/*struct TreeN...原创 2018-08-02 15:16:05 · 148 阅读 · 0 评论 -
二叉树的深度
题目描述:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。题目解析:采用递归遍历:1)如只有1个节点,深度就为12)当前结点的深度就是它的左子树和右子树中深度大的一个再加1./*struct TreeNode { int val; struct TreeNode *left; stru...原创 2018-08-11 10:46:15 · 313 阅读 · 0 评论 -
二叉树的镜像
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 ...原创 2018-08-11 09:42:33 · 584 阅读 · 0 评论 -
求两个链表的第一个公共结点
题目描述:输入两个链表,找出它们的第一个公共结点。题目分析:两个链表要有公共结点,就必须要有公共的尾部,从最后一个节点开始,最后一个不相等的节点就是第一个公共的节点。方法一:使用栈来实现:将两个链表分别push进两个栈中,然后不断的pop,用一个FirCom来记录相等的节点,pop一个值,就更新一下FirCom,最后一次记录的FirCom值就是第一个公共的节点。AC代码:...原创 2018-08-02 11:40:18 · 252 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题目解析:对于后序遍历的序列来说,最后一个值应该是根节点。二叉搜索树的左子树都比根节点小,右子树都比根节点大。因此,对于后序序列,倒着往前找,比最后一个节点大的是二叉树的右子树的节点,比最后一个节点小的是二叉树的左子树的节点。如果在本该是右...原创 2018-08-14 10:15:37 · 251 阅读 · 0 评论 -
复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)题目解析:复杂链表有一个next指针,指向下一个节点,一个random指针,可以指向任意的节点。复杂链表的复制分为三步:1.复制原链表,在原链表的每个节点后...原创 2018-08-01 17:39:44 · 145 阅读 · 0 评论 -
剑指offer:合并两个排序的链表
解题思路:两个链表是排序好的,比较两个链表的头结点的值,小的那个结点做新链表的头结点。依次比较各个节点的值,有序的链入到新链表中。其中一个链表已经比较完了,将另一个链表剩下的结点都链入到新链表中。在线AC:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NU...原创 2018-08-01 15:53:10 · 148 阅读 · 0 评论 -
把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。题目解析:采用层序遍历的思想。将节点push进队列中,当队列不为空时,增加两个变量,一个用来计数,一个用来获取当前队列中的节点个数。当计数小于总数时,说明这些节点在一层中,将这些节点push_back进vector1中。再遍历当前结点的左子树和右子树,将vector1 push_back 进vector2中。队列...原创 2018-08-09 16:47:55 · 288 阅读 · 0 评论 -
连续子数组的最大和
题目描述:输入一个整型数组,数组理由整数也有负数。数组中有一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。输入:3 -1 1 2 (3为输入的个数,后面3个位数组中的元素{-1,1,2})输出:3 (1+2=3)输入:8 1 -2 3 10 -4 7 2 -5 (数组为{1,-2,3,10,-4,7,2,-5})输出:18 (3,10,-4...原创 2018-06-01 23:58:56 · 252 阅读 · 0 评论 -
面试题:二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如在如下的数组中查找数字7的过程如下:数组: 1 2 8 9 2 4 9 12 4 7 10 13 ...原创 2018-05-29 18:28:21 · 266 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.这道题出自《剑指offer》中的面试题。一种简单的算法是,先对数组进行排序,排序之后位于数组中间的数字就一定是出现次数超过数组长度一半的数字。排序算法的时间复杂度为O(nlogn)。下面是两个O(N)...原创 2018-05-28 18:51:20 · 292 阅读 · 0 评论 -
顺时针打印矩阵
题目描述:对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。测试样例:[[1,2],[3,4]],2,2返回:[1,2,4,3]题目解析:将问题分解为一下几个步骤:1)从左到右打印矩阵2)从上到下打印矩阵3)从右到左打印矩阵...原创 2018-08-28 16:09:41 · 260 阅读 · 0 评论