蒲公英110

解决面试题的思路

很多面试官都喜欢应聘者在写代码之前先讲清楚思路,举例子和画图都是很好的方法

面试官希望应聘者在分析中发现自己想法中的错误和漏洞。

 

面试题19:二叉树的镜像

 

View Code

 

 

面试题20:顺时针打印矩阵

输入一个矩阵,从外向里以顺时针的顺序依次打印出每个数字

每打印一圈的起始点选为对角线上的点,即此时x = y

判断循环继续的条件是columns > 2 * start 并且 rows > 2 * start

注意最后一圈的情况可能会退化为一行、一列、甚至是只有一个数字

View Code

 

面试题21:包含min函数的栈

题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。

利用一个辅助栈始终记录数据栈当前的最小值。

View Code

 

断言包含assert.h文件

断言语句示例(括号内是true的语句,若为false出错)

assert(m_data.size() > 0 && m_min.size() > 0);

 

 

面试题22:栈的压入弹出序列

 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。

分析:这里的压入弹出不是一次性完成的,比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列

写函数第一步一定要要先判断非法输入 指针是否为NULL 长度大于0等等。!!!

因为const、&等的运用可以加分,所以要记得,特别是形参部分的&和const

View Code

这是我自己写的,没看源码

 

面试题23:从上往下遍历二叉树

 题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。

典型的层序遍历,利用先进先出的队列,一次从后面放入待处理的数据,在前面取出数据进行处理

View Code

 不管是广度优先遍历一个有向图还是一棵树,都要用到队列。第一步把其实节点(在树中是指根节点)放入到队列中,接下来每一次从队列头部取出一个节点,遍历这个节点之后把从它能到达的节点(対树而言是子节点)都依次放入队列。我们重复这个遍历过程,直到队列中的节点全部都被遍历为止。

 

面试题24:二叉搜索树的后续遍历序列

这题省略

 

面试题26:复杂链表的赋值

  1. 可以利用空间换时间,建立哈希表,把<S,S’>映射到哈希表上,就可以方便地找到m_pSibling指针的指向。空间和时间复杂度均为O(n)。
  2. 亮点在于一开始节点创建时的不同,N点对应的N’点是直接连接在N点之后的,那么要找的N’的m_pSibling指向的对象就是N的m_pSibling指向的对象的下一个。

  

View Code

 

面试题27:二叉搜索树和双向链表

  首先我们可以发现中序遍历的最后一个节点就是这棵树中的最大值。主要是用递归的思想,先排好左子树,然后是根节点,然后再去排右子树。

  

 

面试题28:字符串的排列

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。

考查对递归理解的编程题

 

View Code

 

如果要做到相同的字符串只输出一次,则只要在交换之前判断一下是否交换即可,相同则不交换。

 

  if(pBegin != pTemp && *pBegin == *pTemp)  //添加在for循环里面的第一句
    continue;

理论上相同的字符相同的位置只能算一次的才叫排列,即121、211、112构成3个排列,这里面只有一个组合。

那么要求字符串的组合

桶排序一下,递归输出,如果有3个a就有0、1、2、3四种方式;如果所有字符确定是不同的那么用ab = 110, c = 001, abc = 111,二进制表示选择情况(a就只有有或者没有两种情况)

求8个数的组合,然后相加判断三个对面的各是否相等即可

 

求不相同的排列情况,判断是否符合条件,先画一个正方体,有利于理解对面的概念。

 

  

棋子排列问题

 

  

全排列可以确定不在一行一列上,最后两个式子确定不在对角线上

 

posted on 2016-10-21 16:43  蒲公英110  阅读(243)  评论(0编辑  收藏  举报

导航