笔试整理

一、选择,3分一个

1、单链表插入的代码是

public class MyLinkedList<T>{

  public Node<T> current;

  public Node<T> head;

  public Node<T> end;

  public int count;

  public void add(T t){

    Node<T> newEnd = new Node<T>(t);

    if(head==null){

       head = newEnd;

       end = head;

       currend = head;

    }else{

      end.next = newEnd;

      end = end.next;

    }

    count++;

  }

}

2、3个节点的二叉树有多少种

  5种

3、n个点的无向图要连通,最少需要几条边

  n-1条边

4、写了个广义表,问深度和广度

① E=()
      E是一个空表,其长度为0。
  ② L=(a,b)
      L是长度为2的广义表,它的两个元素都是原子,因此它是一个线性表
  ③ A=(x,L)=(x,(a,b))
      A是长度为2的广义表,第一个元素是原子x,第二个元素是子表L。
  ④ B=(A,y)=((x,(a,b)),y)
      B是长度为2的广义表,第一个元素是子表A,第二个元素是原子y。
  ⑤ C=(A,B)=((x,(a,b)),((x,(a,b)),y))
      C的长度为2,两个元素都是子表。
  ⑥ D=(a,D)=(a,(a,(a,(…))))
      D的长度为2,第一个元素是原子,第二个元素是D自身,展开后它是一个无限的广义表

表L、A、B、C的深度为分别为1、2、3、4,表D的深度为∞。
选择最深的 从后面数后括弧,就是深度(单个原子是0,两个以上就是1了)。广度就是元素个数。

5、n个节点的完全二叉树,深度为?

「log2n」+1 


二、写SQL语句4分一个,5道


三、基础题
1、fun(9999)的值,写出思路(4分)

  1. int fun(int x)  
  2. {  
  3.     int count = 0;  
  4.  while(x)  
  5.  {  
  6.      count++;  
  7.   x = x&(x-1);  
  8.  }  
  9.  return count;  

对9999转换成2进制是 10011100001111 (十进制转2进制是除2求余,从下向上数开头写1),发现有8个1,向下做与运算可以循环8次归零。所以是8

2、找出以下代码的bug,大约10行(10分)
3、栈R和队列Q,栈从顶到底为{2,4,6,8,10},将栈元素出栈并入队Q,再入栈后元素为 (5分)

  翻过来
4、A、B、C、D、E、F分别为0-9的数,已知
ABCDEF*2 = CDEFAB, CDEFAB*2 = EFABCD
求ABCDEF分别为多少,写出思路(6分)

int max = 1000000;

int min = max/2/2;

for(int i=100000;i<min;i++){

   int A = i/100000;

   int B = (i%100000)/10000;

   int C = (i%10000)/1000;

   int D = (i%1000)/100;

   int E = (i%100)/10;

   int F = i%10;

   //...继续

  }

}


四、简答题,10分一个
1、深入描述自己熟悉的2个设计模式,并说明适用场合

单例模式:

在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。适用于某些类创建比较频繁,系统开销很大的对象。对于某些需要集中控制的应用的控制器应该是单例子,否则可能会混乱。

代理模式:

在所调用方法的前后分别加入代理做的工作。可以在不违反开闭原则的条件下对原有方法进行改进,在实现原有方法的基础上做补充。springAOP就是利用动态代理实现的。


2、详细描述HashMap的实现原理

数组和链表的结合体。HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放。



移动终端方向


1、链表逆置

LinkedList l = ...;

Node head = l.head();

Node pre = head.pre;

Node next = head.next;

while(next!=null){

   head.next = pre;

pre = head;

head = next;
next = next.next;
}
head.next = pre;


2、深度遍历目录,并列出其中所有的文件。要求
  1)可以用已有API,也可以自己实现
  2)分别用迭代和递归两种方式实现

递归

public void listFile(File file){

  if(file.canRead()){

    if(file.isDirectory()){

      File[] files = file.listFiles();

      for(int i=0;i<files.length;i++){

        listFile(file[i]);

      }

    }else{

      System.out.println(file);

    }

  }

}

迭代

    public static void listFiles(File file) {
        List<File> flist = new ArrayList<File>();
        flist.add(file);
        while (!flist.isEmpty()) {
            File f = flist.remove(0);
            System.out.println(f);
            if (f.isDirectory()) {
                for (File ff : f.listFiles()) {
                    flist.add(ff);
                }
            }
        }
    }

3、字符串全排,比如abc的全排是abc、acb、bac、bca、cab、cba

    public static void listAllCans(List<String> strs) {
        sort(strs, new ArrayList<String>());
    }

    public static void sort(List<String> unused, List<String> used) {
        if (unused.isEmpty()) {
            System.out.println(used);
        } else {
            for (int i = 0; i < unused.size(); i++) {
                List<String> unbuf = new ArrayList<String>(unused);
                List<String> buf = new ArrayList<String>(used);
                buf.add(unbuf.remove(i));
                sort(unbuf, buf);
            }
        }
    }

4、求有根二叉树中节点D和T的最近祖先
5、left join,right join和inner join的区别

join等价于inner join内连接,是返回两个表中都有的符合条件的行。
 
left join左连接,是返回左表中所有的行及右表中符合条件的行。
 
right join右连接,是返回右表中所有的行及左表中符合条件的行。

6、写SQL语句
7、题目太长
8、有7g和2g的砝码和一个天平,怎么用3次把140g的盐氛围50g和90g?

(1)用7g+2g的砝码称出9g盐,140g-9g=131g
 (2)用7g+2g砝码把131g盐分成两部分61g,70g (61+2+7=70)
(3)用2g砝码和9g盐把61g盐分成50g和11g两部分(61-9-2=11,11+50=61)。11g+9g+70g=90g


1、 设a,b,c三个元素的进栈次序是a,b,c,符号PUSH与POP分别表示对堆栈进行一次进栈操作与一次出栈操作

(1)     请分别写出所有可能的出栈序列以及获得该出栈序列的操作序列

(2)     指出不可能出现的出栈序列


可能的序列:a b c  (a进a出,b进b出,c进c出)

a c b (a进a出bc进c出b出)

b a c(ab进b出a出c进c出)

b c a(ab进b出c进c出a出)

c b a(abc进cba出)

不可能的序列:c a b



2、 已知某二叉树的后序遍历序列是dabec,中序遍历序列是deabc,它的前序遍历序列是什么?

前序:先根,然后左,最后右
中序:先左,然后根,最后右
后续:先左,然后右,最后根
根据这个可以推出:该树为:c
                                            /
                                          e
                                        /   \
                                       d    b
                                                \
                                                  a
所以前序为:cedba

根据后序和中序的规则可以知道c为根结点且没有右子树,根据规则,可以看出d是最左边的一个结点,中序d后面是e,所以e为d的根结点,后序d后面是ab,而中序e后面是ba,
所以b为e的右子树,a为b的右子树


3、将长度为n的单链表链接在长度为m的单链表之后的算法的时间复杂度是多少?
O(m)从链表头到链表尾需要花O(m)的时间。之后再链接上要O(1)的时间。跟链接上的链表长度无关所以总共要O(m)的时间
4、在有序表(12,24,36,48,60,72,84)中二分查找关键字72时所需进行的关键字比较次数是多少?
二分查找法的比较过程:每次取中项与查找数比较,若大于中项向左比较,若小于中项向右比较;一直取中项比较,直到与中项相等就停止比较。

(12,24,36,48,60,72,84)  查找值:72

第1次,7个数中取中项是第4个,中项=48,48<72,所以向右比较,中项48的右侧剩{60,72,84}这3个数;

第2次,{60,72,84}的中项是72,与查找值相等,比较结束

-----------------------------------------------------------
5、现有一圆环形路,路上有n个加油站,第i个加油站储存有Ni升容量的油,每两个加油站之间有一定的距离(km),一汽车初始无油,该车每公里消耗w升油,请问该车从哪个加油站出发可以绕该环形路行驶一圈。给出所有的算法及时间的复杂度。
6、B-树和B+树有什么区别,用在什么地方?
B+树是对B-树的改进,要求所有的信息都在叶子节点上,且叶子节点都在同一深度,而B-树的叶子节点可以在任意深度。用在大规模数据存储上


第二部分软件工程
1、软件生存周期各阶段的活动定义是什么?

软件生存周期包括可行性分析、项目开发计划、需求分析、概要设计、详细设计、编写代码、软件测试和软件维护等活动


2、程序的三种基本控制结构是什么?
顺序、选择和循环结构
3、汽车有一个发动机。汽车和发动机之间的关系是什么关系?请画出这种关系的UML图
发动机——>(is_part_of)汽车,可以用组合关系进行表达(菱形实心箭头)


第四部分   逻辑

1、你让工人为你工作7天,给工人的回报是1根金条。金条平分成相连的7段,你必须在每天结束时给他们1段金条,如果只许你两次把金条弄断,你如何给你的工人付费?
分成比例1:2:4的三段,因为两次弄断就是三段,第一天你给1,第二天你给2,找回你1,你自己就有1和4,第三天再给1,自己剩下4,第四天给4,然后叫他把1.2找给你,第五天给1,第六天给2叫他1找给你,第七天把最后1给他,
2、请把1盒蛋糕分成8份,分给8个人,但蛋糕盒里还必须留有一份
把切成的8份蛋糕先拿出7份分给7人,剩下的1份连蛋糕盒一起分给第8个
3、U2合唱团在赶往演唱会场的途中必须跨过1座桥,4个人从桥的同一端出发,你得帮助他们到达另一端,天色很暗,而他们只有一只手电筒。一次同时最多可以有2人一起过桥,而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥的两端。4个人的步行速度各不同,若2人同行则以比较慢的人速度为准。Bono需要花1分钟过桥,Edge需花2分钟过桥,Adam需花5分钟过桥,Larry需花10分钟过桥。请写出最短的时间和步骤。

4、有7克、2克砝码各一个,天平一只,如何只用这些物品3次将140的盐分为50,90,个、克各一份?
  1.先用7+2 量出9g盐,131g盐。
  2.61g盐,70g盐。
  3.11g盐,50g盐,成功

5、4,4,10,10,运用加减乘除,怎么得出24点?
(10*10-4)/4=24
 

 

第五部分  其它

1、请阐述进程和线程的区别
所谓进程,本身不能执行,它只是一个资源的集合体,拥有地址空间,模块,内存,...
线程是真正的执行单元,一个进程如果没有线程,那么就没有存在的意义,因为不可能执行。
2、常用的内存管理方法有哪几种
段式管理(每次分配的大小不固定)
页式管理(每次分配的大小固定)
段页式(二者综合)
3、请说出ISO网络参考模型有哪几层,并简单描述每一层功能
好,回到OSI,这个以计算机为原始设备的通信模型,考虑的要复杂一些而已,分成了7个层次。最底层,物理层:负责具体的传输媒介以及其对应的传输方式,解决的问题是实现比特流的传输。数据链路层:负责相邻两个节点间比特流的识别,即以字节为单位去找出“每页信纸”。网络层:实现网络中任意两个节点间的连通和数据转发。。传输层:实现任意两台电脑中相应进程间的连接,提供两种不同的服务:可靠的和不可靠的。。会话层:提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。表示层:主要解决不同操作系统间信息的语法表示问题。最后应用层:针对用户(人)的各种不同需求,提供一系列的应用程序,满足其通信要求。
 

 

第六部分  Java

1、Java多线程有几种实现方法?
两种,继承Thread,实现Runnable接口
2、String与StringBuffer的区别
String每次改变新创建对象,stringBuffer可以原对象追加。
3、ArrayList和Vector主要区别是什么?
Vector线程安全
4、请简述servlet的生命周期
首先是在第一次请求到达时被服务器实例化,容器调用init()初始化,当请求到达调用service()根据请求类型自动选择调用doGet或者doPost,销毁时调用destory()

 

第七部分  .NET

1、声明常量时通常会用关键字const和static,请说明两者的不同

2、String与StringBuilder的区别

3、Asp.Net种页面之间传值有几种方式?

4、Asp.Net中的Session经常丢失,怎么解决?


Nosql数据库,特点

MangoDB ,Hbase

是非关系型数据库,他们不保证数据的ACID特性,这点是和关系型数据库最大的区别,他们关心的是高效率和高扩展性,适合海量数据存储


谈谈你对多态的理解

多态有两种表现形式:重载和覆盖
多态性语言具有灵活、抽象、行为共享、代码共享的优势

死锁的来源,原因,及解决方法。

简言之相互占有相互等待形成死锁

ER图
主键用下划线,两张表的联系是用外键来表示的,画ER图时需要有一个两张表的公共属性来作为其连接的条件,
表对象方框,属性椭圆,关系菱形1-1,1-N 1对1,1对多

1.1数据结构的特性
数据结构    |    优点                |         缺点
数组    |  插入快,如果知道下标,可以非常快的存取  |    查找慢,删除慢,大小固定
有序数组    |      比无序数组查找快            |    删除和插入慢,大小固定
栈    |      后进先出                |    存取其他项很慢
队列    |      先进先出                |    同上
链表    |    插入快,删除快            |    查找慢
二叉树    |  查找,插入,删除都快(如果树保持平衡)  |   删除算法复杂    
哈希表    |  如果关键字已知则存取极快。插入快        |    删除慢,如果不知道关键字则存取很慢,对空间使用不充分

面向对象编程的两个重要特征:继承与多态

软件工程:软件项目的生命周期,包快分析、设计、验证、编码、测试、生产和维护各阶段。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值