
程序员面试经典
文章平均质量分 68
Aguangg_6655_la
充电。。。
展开
-
程序员面试经典--置零矩阵
1.7问题:编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零。思考:边遍历边置零,这样会有一个陷阱导致最后整个矩阵都会被置0。所以可以遍历两次,第一次确定0的位置,第二次置0相应行列。import java.util.*;class setzero{ public static void main(String args[]){ int a[][]={{1,1,原创 2017-04-07 10:35:06 · 543 阅读 · 0 评论 -
程序员面试经典--旋转矩阵
1.6问题:给定一副由N*N矩阵表示的图像,其中每个像素的大小为4字节,编写一个方法,将图像旋转90°。不占用额外的内存空间能否做到?思考:假设顺时针旋转90°。不占额外内存空间的情况下,一个一个索引进行交换,将上边移到右边,右边移到下边,下边移到左边,左边移到上边。时间复杂度为O(n^2),已是最优做法。import java.util.*;class rotate{ publi原创 2017-04-06 22:13:55 · 593 阅读 · 0 评论 -
程序员面试经典--巧用散列表
问题1.1:实现一个算法,确定一个字符串的所有字符是否全都不相同。import java.util.*;public class StrArray{ public static void main(String args[]){ StringBuffer s = new StringBuffer("abcdaefghijklmnopqrstuvwxyz"); if(i原创 2017-04-05 21:40:05 · 471 阅读 · 0 评论 -
程序员面试经典--字串
1.2 问题:用C或C++实现void reverse(char* str)函数,即反转一个NULL结尾的字符串。#include/*不分配额外空间解决问题*/void reverse(char *str){ char* end = str; char tmp; if(str){ while(*end){ end++; } end--; while(str<原创 2017-04-06 10:38:13 · 409 阅读 · 0 评论 -
程序员面试经典--判断变位词
1.3问题:给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。方法一:import java.util.*;public class sort{ public static void main(String args[]){ String s = new String("abcdaefghijklmnopqrstuvwxzya"); St原创 2017-04-06 11:49:19 · 770 阅读 · 0 评论 -
程序员面试经典--检查二叉树是否平衡
4.1问题:实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个结点,其两棵子树的高度差不超过1.思考:可以直接递归访问整颗树,计算每个结点的两棵子树的高度。 public static int getHeight(Node root){ //获取二叉树的深度 if(root == null){ return 0;//终止条件 } retur原创 2017-04-15 22:47:50 · 684 阅读 · 0 评论 -
程序员面试经典--空格替换
1.4问题:编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串尾部有足够的空间存放新字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)思想:扫描两次,第一次统计多少空格;第二次,反向编辑字符串,监测到空格则将%20插入,若不是,就复制原字符。import java.util.*;public class repla原创 2017-04-06 18:21:48 · 362 阅读 · 0 评论 -
程序员面试经典--字串压缩
1.5问题:利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。思考:怎样降低时间复杂度,提高代码效率。防止做无用功,可先判断压缩串长度是否大于原串,若是则返回原串,若否则返回压缩串。import java.util.*;class compress{ public原创 2017-04-06 20:39:40 · 582 阅读 · 0 评论 -
程序员面试经典--有向图路径验证
4.2问题:给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。思考:只需通过图的遍历,比如深度优先搜索或广度优先搜索等,就能解决这个问题。我们从两个节点的其中一个出发,在遍历过程中,检查是否找到另一个结点。在这个算法中,访问过的结点都应标记为“已访问”,以免重复访问结点。关于邻接表与图的基本实现与操作:import java.util.*;/** * 邻原创 2017-04-20 10:17:04 · 967 阅读 · 0 评论 -
程序员面试经典--创建最小二叉查找树
4.3问题:给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉查找树。思考:要创建一棵高度最小的树,就必须让左右子树的节点数量越接近越好,也就是说,我们要让数组中间的值成为根结点,这么一来,数组左边一半就成为左子树,右边一半成为右子树。运用createMinimalBST方法,递归的方式,这个方法会传入数组的一个区段,并返回最小树的根结点。该算原创 2017-04-20 19:17:35 · 675 阅读 · 0 评论 -
程序员面试经典--创建二叉树层结点链表
4.4问题:给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为D,则会创建出D个链表)。思考:1、我们可以将前序遍历稍加修改,将leve+1传入下一个递归调用。下面是使用深度优先搜索的实现代码。 public void createLevelLinkedList(Node root,ArrayList> lists,int level){//先序原创 2017-04-21 14:45:10 · 623 阅读 · 0 评论 -
程序员面试经典--判断二叉查找树
4.5问题:实现一个函数,检查一棵树是否为二叉查找树。思考:方法一:看到此题,闪过的第一个想法就是中序遍历,将所有的元素复制到数组中,然后检查数组是否有序。这种解法要多用一点儿内存,大部分情况下都没问题。唯一的问题是,它无法处理树中的重复值。例如,该算法无法区分下面这两棵树,因为这两者的中序遍历是一样的。Valid BST [20.left = 20]Invalid BST [原创 2017-04-21 17:15:46 · 772 阅读 · 0 评论 -
程序员面试经典--动物收容所
3.7问题:有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(根据进入收容所的时间长短)的动物,或者,可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueue、dequeueany、dequeuedog和dequeuecat等原创 2017-04-12 21:33:24 · 755 阅读 · 0 评论 -
程序员面试经典--栈排序
3.6问题:编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中(如数组)。思考:待排序栈s1,将自己的数据从栈顶不断的出栈按升序插入临时数据栈s2。插入操作时,可将s1作为缓冲,直到插入操作完成。import java.util.*;class sort{ public static void main(S原创 2017-04-12 15:34:10 · 577 阅读 · 0 评论 -
程序员面试经典--删除链表重复节点
2.1问题:编写代码,移除未排序链表中的重复节点。方法一:可使用临时缓冲区情况下,可用简单的散列表记录节点并判断是否重复。import java.util.*;//节点类class Node { protected Node next; //指针域 protected int data;//数据域 public Node( int data) { this.dat原创 2017-04-08 16:52:20 · 526 阅读 · 0 评论 -
程序员面试经典--链表节点查找
2.2问题:实现一个算法,找出单向链表中倒数第k个节点。链表数据:import java.util.*;//节点类class Node { protected Node next; //指针域 protected int data;//数据域 public Node( int data) { this.data = data; } //显示此节点 pu原创 2017-04-08 19:32:09 · 576 阅读 · 0 评论 -
程序员面试经典--删除结点(仅能访问该结点)
2.3问题:实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。思考:题目给出,访问不到链表首结点,只能访问那个待删除结点。可以将该结点的后继结点数据拷贝到当前结点,然后删除这个后继结点。import java.util.*;//节点类class Node { protected Node next; //指针域 protected int data;//原创 2017-04-08 20:56:42 · 449 阅读 · 0 评论 -
程序员面试经典--链表分割
2.4问题:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排列在大于或等于x的结点之前。思考:可以直接创建两个链表,一个链表存放小于x的元素,另一个链表存放大于或等于x的元素。迭代访问整个链表之后,合并两个链表即可。import java.util.*;//节点类class Node { protected Node next; //指针域 protect原创 2017-04-09 11:14:25 · 455 阅读 · 0 评论 -
程序员面试经典--双链表求和
2.5问题:给定两个用链表表示的数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。思考:递归思想,非常巧妙,需仔细分析思考,递归多次,每次都会创建一个节点,反馈给上一级,上一级的链表结点指针指向下一级创建的结点。当多级递归完成时,就会返回这个链表的首结点。完成运算。import java.util.*;//节点类原创 2017-04-09 16:03:32 · 522 阅读 · 0 评论 -
程序员面试经典--链表环路检测与入口结点返回
2.6问题:给定一个有环链表,实现一个算法返回环路的开头结点。思考:第一:监测链表是否存在环路。有一种简单的方法叫做fastrunner/slowrunner法。fastruner一次移动两步,slowrunner一次移动一步。如果存在环路,最终必然会碰到一起。第二:什么时候碰到一起? 1、slowrunner处于环路中的0步位置; 2、fastrunner处于原创 2017-04-09 19:33:15 · 848 阅读 · 0 评论 -
程序员面试经典--链表回文判断
2.7问题:编写一个函数,检查链表是否为回文。思考:若链表长度未知,可用快慢runner指针的方法,迭代访问链表将链表的前半部分入栈,然后将栈内的数据与链表的后半部分进行对比。import java.util.*;//节点类class Node { protected Node next; //指针域 protected int data;//数据域 public N原创 2017-04-10 10:50:42 · 431 阅读 · 0 评论 -
程序员面试经典--返回栈中最小元素
3.2问题:请设计一个栈,除去pop与push方法,还支持min方法,可返回栈元素中的最小值。push、pop和min三个方法的时间复杂度必须为O(1)。思考:一种解法是,在Stack类里添加一个int型的minvalue。当minvalue出栈时,我们会搜索整个栈,找出新的最小值。可惜,这不符合入栈出栈时间复杂度O(1)的要求。另一种解法,就是每次入栈都要记下这个状态下的最小值。原创 2017-04-11 16:54:38 · 792 阅读 · 0 评论 -
程序员面试经典--栈实现堆盘子
3.3问题:设想有一堆盘子,堆太高可能会倒下来。因此,在显示生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。setOfStacks应该由多个栈组成,并且在当前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SeOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况原创 2017-04-11 20:34:12 · 677 阅读 · 0 评论 -
程序员面试经典--汉诺塔
3.4问题:在经典汉诺塔中,有三根柱子以及N个不同大小的穿孔圆盘,盘子可以化入任意一根柱子。一开始,所有 盘子自底向上从大到小一次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时有以下限制: 1、每次只能移动一个盘子; 2、盘子只能从柱子顶端滑出移到下一根柱子; 3、盘子只能叠在比它大的盘子上。请运用栈,编写程序将所有盘子从第一根柱子移到最后一根柱子。原创 2017-04-11 21:34:24 · 1023 阅读 · 0 评论 -
程序员面试经典--用栈实现队列
3.5问题:实现一个MyQueue类,该类用两个栈来实现一个队列。思想:定义两个栈,stackNewest和stackOldest,stackNewest顶端为最新元素,stackOldest顶端为最旧元素。在将一个元素出列时,我们希望先移除最旧元素,因此先将元素从stackOldest出列。若stackOldest为空,则将stackNewest中的所有元素以相反的顺序转移到stac原创 2017-04-12 13:54:32 · 589 阅读 · 0 评论 -
程序员面试经典--二叉查找树节点的“下一个结点”
4.6问题:设计一个算法,找出二叉树中指定的结点“下一个”结点(也即中序后继)。可以假定每个结点都含有指向父节点的链接。思考:回忆一下中序遍历,它会先遍历左子树,然后是当前节点,接着右子树,要解决这个问题需要非常小心。假定我们有一个假想的结点,先是左子树,然后是当前结点,最后就是右子树,目标结点当然是在右子树,那么是右子树的哪一个呢?很简单,就是右子树的最左边的那个结点。在这种情况原创 2017-04-22 11:03:08 · 710 阅读 · 0 评论