【java】程序员面试金典
文章平均质量分 53
half1_2_1
这个作者很懒,什么都没留下…
展开
-
9.7数学与概率(六)——检查一个数是否为素数
/** * 功能:检查一个数是否为素数。 */两种方法:方法一:/** * 思路:从2到n-1进行迭代,每次迭代都检查能否整除。 * @param n * @return */ public static boolean primeNaive(int n){ if(n<2) return false; for(int i=2;i<n;i++)原创 2015-08-08 13:13:14 · 668 阅读 · 3 评论 -
9.3栈和队列(九)——动物收容所,先进先出
/** * 功能: * 描述:有家动物收容所只收容狗和猫,且严格遵守“先进先出”的原则。收养人只能收养所有动物中“最老” * (根据进入收容所的时间长短)的动物。创建适用于这个系统的数据结构,实现各种操作方法,比如 enquene, * dequeneAny,dequeneDog和dequneCat等。允许使用JAVA内置的LinkedList数据结构。 */原创 2015-08-04 18:34:48 · 912 阅读 · 0 评论 -
9.3栈和队列(八)——按升序对栈进行排序
/** * 功能:按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将元素 * 复制到其他数据结构中(如数组)。该栈支持如下操作:push,pop,peek和isEmpty。 */三种方法:1、方法一:实现初步的排序算法:搜索整个栈,找出最小元素,之后将其压入另一个栈。然后,在剩余元素中找出最小的压入栈。注意:实际上需要三原创 2015-08-04 17:51:36 · 2460 阅读 · 0 评论 -
9.3栈和队列(七)——用两个栈来实现一个队列
/** * 功能:用两个栈来实现一个队列。 */import java.util.*;/** * 思路:需要修改peek()和pop(),以相反顺序执行操作。可以利用第二个栈来反转元素的次序。 * stackNewest顶端为最新元素,stackOldest顶端为最旧元素,利用两个栈的元素的转移来实现。 * */public class MyQuene1 {原创 2015-08-04 17:00:11 · 409 阅读 · 0 评论 -
9.3栈和队列(五)——汉诺塔问题
/** * 功能:汉诺塔问题 * 描述:有3根柱子及N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始, * 所有盘子自底向上从大到小依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。 * 移动圆盘时有以下限制: * 1)每次只能移动一个盘子。 * 2)盘子只能从柱子顶端滑出移到下一根原创 2015-08-04 16:24:41 · 1038 阅读 · 0 评论 -
9.3栈和队列(三)——设计一个栈,出pop与push方法,还支持 min方法,可返回栈元素中的最小值
/** * 功能:设计一个栈,出pop与push方法,还支持min方法,可返回栈元素中的最小值。三个方法的时间复杂度必须为O(1)。 */两种方法:方法一:/** * 思路:每个结点记录当前最小值。 * 缺点:当栈很大时,每个元素都要记录 min,就会浪费大量空间。 */public class StackWithMin extends Stack{原创 2015-08-04 15:22:25 · 709 阅读 · 0 评论 -
9.3栈和队列(二)——用一个数组来实现三个栈
/** * 功能:用一个数组来实现三个栈 */两种思路:固定分割和弹性分割方法一:固定分割//固定分割 int stackSize=100; int[] buffer=new int[3*stackSize]; int[] stackPointer={-1,-1,-1}; public void原创 2015-08-04 15:20:09 · 824 阅读 · 0 评论 -
9.3栈和队列(一)——栈
class MyStack{ Node top; int pop(){ if( top!= null){ int item= top. data; top= top. next; return item;原创 2015-08-04 15:18:37 · 383 阅读 · 0 评论 -
9.3栈和队列(四)——堆盘子
/** * 功能:堆盘子 * 设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。 * 数据结构SetOfStacks由多个栈组成,并且,在前一个栈填满时新建一个栈。 * 此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同。 * * 进阶:实现一个popAt(int i原创 2015-08-04 15:24:10 · 684 阅读 · 0 评论 -
9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值
/** * 攻略:给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式 * 得出result值。 */两种方法:方法一: /** * 思路:迭代整个表达式,将每个运算符当作第一个要加括号的运算符。 * @param exp * @param result * @param s:原创 2015-08-14 15:55:36 · 883 阅读 · 0 评论 -
9.9递归和动态规划(九)——N皇后
/** * 功能:打印八皇后在8*8棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。 * 这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。 */ static int GRID_SIZE=8; /** * 思路:每一行只能摆放一个皇后,因此不需要将棋盘存储为完整的8*8矩阵,只需一维数组,其中columns[r]=c表示有个皇后原创 2015-08-14 14:37:28 · 2743 阅读 · 0 评论 -
9.10扩展性与存储限制(三)——若只有4KB内存可用,该如何打印数组中所有重复的元素
/** * 功能:给定一个数组,包含1到N的整数,N最大为32000,数组可能含有重复的值,且N的取值不定。 * 若只有4KB内存可用,该如何打印数组中所有重复的元素。 */ /** * 思路:4KB最多殉职8*4*2^10个比特。比32000大。创建含有32000个比特的位向量,其中每个比特代表一个整数。 * 遇到重复元素,打印出来。 * @param array原创 2015-08-15 12:00:18 · 880 阅读 · 0 评论 -
9.10扩展性与存储限制(一)——对于超大型的社交网站,展示两个人之间的“连接关系”或“社交路径”
/** * 功能:/** * 思路: * 1)针对每个朋友ID,找出所在机器的位置:int machine_index=getMachineIDForUser(personID); * 2)转到编号为#machine_index的机器。 * 3)在那台机器上,执行:Person friend=getPersonWithID(person_id)。 * * 定义一个Server类,原创 2015-08-15 11:35:53 · 713 阅读 · 0 评论 -
9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
/** * 功能:给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB * 进阶:内存限制10MB。 */ /** * 思路: * * 1)创建包含40个亿个比特的位向量。 * 位向量(BV,bit vector)其实就是数组,利用整数(或另一种数据类型)数组紧凑地储存布尔值。每个整数可存储一串32比特或布尔值。原创 2015-08-15 11:38:18 · 1069 阅读 · 0 评论 -
9.2链表(七)——检查链表是否为回文
/** * 功能:检查链表是否为回文 */三种方法:1、反转链表,然后与原链表比较 //反转并比较 public static boolean isPalindrome(LinkedListNode head){ if( head== null) return false;原创 2015-08-03 15:46:44 · 440 阅读 · 0 评论 -
9.3栈和队列(六)——队列
public class MyQuene { Node first,last; public void enquene(int data){ if(first==null){ first=new Node(data); last=first; }else{ last.next=new Node(data); last=last.next; } }原创 2015-08-04 16:59:06 · 339 阅读 · 0 评论 -
9.5位操作(三)——给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数
/** * 功能:给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数。 * (一个略大一个略小。) */三种方法:方法一:蛮力法方法二:位操作法 /** * 方法:位操作法 * 思路:获取后一个较大的数 * 1)计算c0和c1。c1是拖尾1的个数,c0是紧邻拖尾1的作坊一连串0的个数。 * 2)将最右边、原创 2015-08-06 12:06:50 · 1851 阅读 · 0 评论 -
9.5位操作(一)——M插入N,使得M从N的第j位开始,到第i位结束
/** * 功能:给定两个32位的整数N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第j位开始, * 到第i位结束。假定从j为到i位足以容纳M,也即若M=10011,那么j和i之间至少可以容纳5个位。例如,不可能出现j=3 * 和i=2的情况,因为第3位和第2位之间放不下M。 */注意:M和N的输入进制数 public原创 2015-08-06 11:57:07 · 772 阅读 · 0 评论 -
9.11排序与查找(六)——给定M*N矩阵,每一行、每一列都按升序排列,找出某元素
/** * 功能:给定M*N矩阵,每一行、每一列都按升序排列,找出某元素。 */两种方法:方法一: /** * 思路:若列的末端大于x,那么x位于该列的左边;若行的开头小于x,那么x位于列的下边。从矩阵中的子矩阵中查找元素。 * @param matrix * @param elem * @return */ public static b原创 2015-08-21 10:50:13 · 4579 阅读 · 0 评论 -
9.11排序与查找(二)——对字符串数组进行排序,将所有的变位词排在相邻的位置
/** * 功能:对字符串数组进行排序,将所有的变位词排在相邻的位置。 */两种方法:方法一: /** * 思路:套用排序算法,并修改比较器。这里比较器用来指示两个字符串胡伟变位词就是相等的。 * @param array */ public static void sort(String[] array){ Arrays.sort(array, ne原创 2015-08-20 17:43:25 · 981 阅读 · 0 评论 -
9.11排序与查找(一)——给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序
/** * 功能:给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序。 */ /** * 问题:如果将元素插入数组A的前端,就必须将原有的元素向后移动,以腾出空间。 * 思路:将元素插入数组A的末端。 * * 注意:在处理完B的元素之后,不需要复制A的剩余元素,因为那些元素原本就在A中。 * @param a * @pa原创 2015-08-20 17:42:19 · 1609 阅读 · 1 评论 -
9.11排序与查找(四)——20GB的文件,每一行一个字符串,说明如何将这个文件进行排序
设想有一个20GB的文件,每一行一个字符串。说明如何将这个文件进行排序。思路:外部排序,将部分数据载入内存。将整个文件划分成许多块,每个块xMB,其中x是可用的内存大小。每个块各自进行排序,然后存回文件系统。各个块一旦完成排序,便将这些块逐一合并在一起,最终就能得到全部排好序的文件。原创 2015-08-20 18:11:32 · 1343 阅读 · 0 评论 -
9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详。找出数组中的某个元素。 * 可以假定数组元素原先是按从小到大的顺序排列的。 */ /** * 思路:数组被旋转过了,则寻找拐点。 * @param a * @param left * @param right * @param x:要搜索的元素 * @return原创 2015-08-20 18:07:42 · 2020 阅读 · 0 评论 -
9.11排序与查找(五)——有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置
/** * 功能:有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置。 */ /** * 思路:对二分查找法做修改,与mid比较的地方,如果mid为空字符串,则将mid换到离它最近的非空字符串的位置。 * @param strings * @param str * @return */ public static int search(Strin原创 2015-08-21 10:03:15 · 911 阅读 · 0 评论 -
9.7数学与概率(二)——实现整数的乘法、减法和除法运算,只允许使用加号
/** * 功能:实现整数的乘法、减法和除法运算。只允许使用加号。 *///减法 public static int minus(int a,int b){ return a+negate(b); } //取反 /** * 思路:对正数k的取反,只需要将-1连续加k次;对负数k的取反,只需要将1连续加k次。 * @param a * @return */原创 2015-08-07 16:00:57 · 1071 阅读 · 0 评论 -
9.6智力题(二)——九球称重
题目:给定9个球,其中8个球的重量相同,只有一个比较重。给定一个天平,最多使用两次,找出这个重球。解答:1)将9个小球分为3组,称重一次,确定哪一组小球包含重球。若称重的两组重量相等,则另外未称重的小组包含重球。2)在包含重球的小组中选出两个小球,称重一次,确定重球。原创 2015-08-07 11:51:40 · 4000 阅读 · 0 评论 -
9.5位操作(八)——单色屏幕上画水平线
/** * 功能:有个单色屏幕存储在一个一维字节数组中,使得8个连续像素可以存放在一个字节里。屏幕宽度位w, * 且w可以被8整除(即一个字节不会分布在两行上),屏幕高度可由数组长度和屏幕宽度推算得出。 * 实现方法drawHorizontalLine(byte[] screen,int width,intx1,intx2,inty),绘制从点(x1,y) * 到点原创 2015-08-07 12:25:28 · 952 阅读 · 0 评论 -
9.6智力题(一)——给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟
题目:给定两条绳子,每条绳子燃烧殆尽正好用一个小时,用这两条绳子准确计时15分钟。注意:这些绳子密度不均匀,因此燃烧掉半截绳子不一定正好用时半个小时。解答:1)点燃绳子1一头的同时,将绳子2的两头点燃。2)绳子2燃烧完时,正好过去30分钟。3)将绳子1的另外一头点燃,开始计时。4)15分钟后,绳子1燃烧完毕。原创 2015-08-06 16:54:10 · 3091 阅读 · 1 评论 -
9.5位操作(六)——交换某个整数的奇数位和偶数位,使用指令越少越好
/** * 功能:交换某个整数的奇数位和偶数位,使用指令越少越好(即,位0与位1交换,位2与位3交换,以此列推)。 */ /** * 思路:先操作奇数位,再操作偶数位。将数字n的奇数位右移1位,偶数位左移1位。 * @param x * @return */ public static int swapOddEvenBits(int x){ //奇数位右移原创 2015-08-06 14:18:41 · 856 阅读 · 0 评论 -
9.5位操作(二)——给定一个介于0和1之间的实数,类型为double,打印它的二进制表示
/** * 功能:给定一个介于0和1之间的实数,类型为double,打印它的二进制表示。如果该数字无法精准地用32位以内的二进制表示,则打印“ERROR”。 */两种方法:方法一://将数字乘以2以后,与1比较。 public static String printBinary(double num){ if(num>=1||num<=0) re原创 2015-08-06 12:02:04 · 1288 阅读 · 0 评论 -
9.5位操作(五)——确定需要改变几个位,才能将整数A转成B
/** * 功能:确定需要改变几个位,才能将整数A转成B。 */两种方法:方法一: /** * 思路:使用异或操作。 * 确定A^B有几个位为1。 * @param a * @param b * @return */ public static int bitSwapRequired(int a,int b){ int count=0;原创 2015-08-06 14:15:45 · 647 阅读 · 0 评论 -
9.5位操作(四)——解释代码(n&(n-1))==0的具体含义
题目:解释代码(n&(n-1))==0的具体含义1)(A&B)==0的含义A和B的二进制表示的同一位置绝不会同为1。2)n和n-1若n的最低有效位为1,减去1后为0,其余为均相同,不符合要求。n的最低有效位为0,减去1时,必须向高位借1。3)(n&(n-1))==0的含义n的最高有效位为1,其余位为0。因此,n的值是2的某次方。所以,(n原创 2015-08-06 12:27:53 · 899 阅读 · 0 评论 -
9.9递归和动态规划(十二)——小鸡吃米
/** * 功能:小鸡吃米。 * 小鸡一次可以吃n颗米(n>0),总共有m颗米(m>0),在不考虑小鸡最大能力的情况下,小鸡共有多少种吃法。(m与n之间无大小限定) */ /** * 思路:自上而下的方式。 * 小鸡最后一次吃米,可能吃1颗米,2颗米,……,n颗米。因此,最后一次吃米的吃法,就是之前的总和。 * @param m * @param n原创 2015-08-14 16:12:03 · 976 阅读 · 0 评论 -
9.9递归和动态规划(十)——堆箱子
/** * 功能:给你一堆n个箱子,箱子宽wi,高hi,深di。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。 * 实现方法:搭出最高的一堆箱子,箱子堆的高度为每个箱子高度的总和。 */两种方法:方法一:递归发 //递归法 public static ArrayList createStackR(Box[] boxes,Box bot原创 2015-08-14 14:39:39 · 3676 阅读 · 0 评论 -
9.2链表(四)——以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的节点之前
/** * 功能:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的节点之前。 */两种方法:直接创建两个链表:一个链表存放小于x的元素,另一个存放大于或等于x的元素。1、方法一:插入后端 /* * 直接创建两个链表:一个链表存放小于x的元素,另一个存放大于或等于x的元素。 * 然后迭代访问整个链表,原创 2015-08-03 14:51:05 · 6398 阅读 · 0 评论 -
9.12测试(三)——网页的负载测试
不借助任何测试工具,该如何对网页进行负载测试解答:负载测试:不仅有助于定位Web应用性能的瓶颈,还能确定其最大连接数。同样,还能检查应用如何响应各种负载情况。带测量对象包括:1)响应时间2)吞吐量3)资源利用率4)系统所能承受的最大负载。若缺少正规的测试工具:可以创建成千上万的虚拟用户,模拟并发用户。编写多线程的程序,新建成千上万个线程,原创 2015-08-24 10:18:07 · 707 阅读 · 0 评论 -
9.12测试(四)——测试笔
如何测试一支笔首先,确定Who/What/When/Where/Why/How。然后,确定测试的计划:事实核查预期用途安全性非预期用途原创 2015-08-24 10:19:37 · 597 阅读 · 0 评论 -
9.12测试(二)——国际象棋
有个国际象棋游戏程序使用了放法:boolean canMoveTo(int x,int y),这个方法是Piece类的一部分,可以判断某个棋子能否移动到位置(x,y)。说明如何测试该方法。解答:测试类型1:极限情况测试(错误输入或异常输入)1)测试x和y为负数的情况2)测试x大于棋盘宽度的情况3)测试y大于棋盘高度的情况4)测试一个满是棋子的棋盘5)测试一个空或原创 2015-08-24 10:17:30 · 992 阅读 · 0 评论 -
9.11排序与查找(八)——找出数字x的秩(小于或等于x的值的数目)
/** * 功能:假设你正在读取一串整数。每隔一段时间,你希望能找出数字x的秩(小于或等于x的值的数目)。 * 实现track(int x)方法,没读入一个数字就会调用该方法;以及getRankOfNumber( int x)方法,返回值为小于或等于x的元素个数(不包括x本身)。 */ /** * 思路:采用二叉查找树 * 执行中序遍历,并在访问结点时利用计数器记录原创 2015-08-24 09:30:27 · 903 阅读 · 0 评论 -
9.12测试(五)——测试ATM机
在一个分布式银行系统中,如何测试一台ATM机解答1、确定Who/What/When/Where/Why/How2、确定测试工具,确定是否可以查看源码3、将问题分解:登录取款存款查询余额转账4、确保涵盖所有错误情况(余额不足、新开账户、不存在的账户等)5、安全性和可靠性。原创 2015-08-24 10:24:33 · 1634 阅读 · 0 评论