zoukankan      html  css  js  c++  java
  • Efounds笔试

    Efounds的笔试~

    1.比较两个浮点数大小

    一般不会直接用“==”或者“!=”对两个浮点数进行比较。
    判断两个浮点数float a 与 float b 是否相等可以根据他们的差的绝对值是否大于0来进行判断。
    判断相等:
    if(Math.abs(a-b)<=0){相等}
    或者
    if(!Math.abs(a-b)>0){相等}
    
    判断不等:
    if(Math.abs(a-b)>0){不相等}
    
    

    2,用最快排序找到无序的数组里第K大的数

    public class AlgCode {
        public static void main(String[] args) {
         // int [] nums={5, 7, 1, 8,3, 10};  //测试
            int [] nums=  {3,1,4,7,5,8,0};
            int k=5;
          int  res= findKth(nums,0,nums.length-1,k-1);
          System.out.print("The Kth is: "+res);
        }
    
        private static int findKth(int [] data ,int first , int last ,int k){
            int kth;
            if(first==last) kth=data[first];
            else {
                int pivot = data[first];
                int splitPoint = partition(data, first, last);
                if (k < splitPoint)
                    kth = findKth(data, first, splitPoint - 1, k);
                else if(k>splitPoint)
                    kth = findKth(data, splitPoint + 1, last, k);
                else
                kth = pivot;
               }
               return kth;
            }
    
            private static int partition(int [] data ,int first , int last){
                int pivot = data[first];
                while(first<last) {
                    while (first < last && data[last] > pivot)
                        last--;
                    data[first] = data[last];
                    while (first < last && data[first] < pivot)
                        first++;
                    data[last] = data[first];
                }
                    data[first]=pivot;
                    return first;
            }
        }
    

    3,单链表是否有环并如何找到环入口
    首先要了解什么叫环,如图,Join.next->Pos,Pos.next->Join,那么该链表有环

    public class LinkedLoop{
        //内部静态类定义结点类
    	static class Node{
    	int val;
    	Node next;
    	public Node(int val){
    	this.val = val;
    	}
    }
    	//判断单链表是否有环
    	public static boolean hasLoop(Node head){
    	Node p1=head;  //指向头节点
    	Node p2=head.next;  //指向下一个节点
    
    	while(p2!=null &&p2.next!=null){
    		p1=p1.next;
    		p2=p2.next.next;
    		if(p2==null){
    			return false;
    		}
    		int val1=p1.val;
    		int val2=p2.val;
    		if(val1==val2)
    		return true;
    	}
    	return false;
    }
    
    	public static void main(String [] args){
    		Node n1=new Node(1);
    		Node n2=new Node(3);
    		Node n3=new Node(6);
    		Node n4=new Node(4);
    		Node n5=new Node(5);
    		Node n6=new Node(10);
    		n1.next = n2;
    		n2.next = n3;
    		n3.next = n4;
    		n4.next = n5;
    		n5.next = n6;
    		n6.next = n5;
    		System.out.println(hasLoop(n1));
    	}
    }
    

    4,快排第一次排列后的顺序

    int [] nums=  {3,1,4,7,5,8,0};      
    如果基准为3;
    第一次快排后:
    nums={0,1,3,7,5,8,4}; 
    

    5,Java 数据输入

      int a =0;
      Scanner input = new Scanner(System.in);
      System.out.println("输入数字:");
      a = input.nextInt();
    

    6,软件生命周期

    软件生命周期(SDLC,Systems Development Life Cycle,SDLC)是软件的产生直到报废或停止使用的生命周期。
    软件生存周期包括:

    一,问题定义。要求系统分析员与用户进行交流,弄清“用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”,提交用户审查和确认。

    二,可行性研究。一方面在于把待开发的系统的目标以明确的语言描述出来,另一方面从经济、技术、法律等多方面进行可行性分析。

    三,需求分析。弄清用户对软件系统的全部需求,编写需求规格说明书和初步的用户手册,提交评审。

    四,开发阶段。开发阶段由三个阶段组成:
    1,设计
    2,实现:根据选定的程序设计语言完成源程序的编码。
    3,测试

    五,维护:维护包括四个方面
    1,改正性维护:在软件交付使用后,由于开发测试时的不彻底、不完全、必然会有一部分隐藏的错误被带到运行阶段,这些隐藏的错误在某些特定的使用环境下就会暴露。
    2,适应性维护:是为适应环境的变化而修改软件的活动。
    3,完善性维护 :是根据用户在使用过程中提出的一些建设性意见而进行的维护活动。
    4,预防性维护:是为了进一步改善软件系统的可维护性和可靠性,并为以后的改进奠定基础。

    7,多线程和多进程的区别
    a.进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

    b.进程有独立的地址空间,比如在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种非常昂贵的多任务工作方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,因此启动一个线程,切换一个线程远比进程操作要快,花费也要小得多。当然,线程是拥有自己的局部变量和堆栈(注意不是堆)的,比如在windows中用_begin threadex创建一个新进程就会在调用CreateThread的同时申请一个专属于线程的数据块(_tiddata)。

    c.线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。

    d.由b,可以轻易地得到结论:多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影响。

    e.线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中,由应用程序提供多个线程的并发控制。

    8,多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明
    所谓同步,表示有先有后,比较正式的解释是“线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。”

    所谓互斥,比较正式的说明是“线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。”表示不能同时访问,也是个顺序问题,所以互斥是一种特殊的同步操作。

    举个例子,设有一个全局变量global,为了保证线程安全,我们规定只有当主线程修改了global之后下一个子线程才能访问global,这就需要同步主线程与子线程,可用关键段实现。当一个子线程访问global的时候另一个线程不能访问global,那么就需要互斥。

    9,网络协议:访问某个网址都经过了哪些协议
    ·域名解析协议DNS
    应用层协议,网址相当于是域名,访问DNS服务器,这个过程有域名解析协议,解析出域名对应的IP地址。

    ·超文本传输协议HTTP
    应用层协议,基于请求和响应的协议,通过请求行、消息报头、请求正文向目的地址发送请求。目的服务器在接受请求后,返回一个状态行、消息报头、响应正文的响应。

    ·传输控制协议TCP
    传输层协议,HTTP协议是基于TCP协议的,也就是说HTTP无论是请求还是响应都是把HTTP的内容作为TCP的正文封装到TCP的报文中的。TCP协议是传输安全,面向连接的协议,在客户端和服务端建立TCP/IP五层模型的协议 连接的过程中需要经过三次握手,发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开,以及四次释放的过程才停止发送数据。

    ·网际协议IP协议
    IP协议在整个传输过程中都起着重要的作用,网址通过DNS解析为IP地址,在TCP建立连接以及传输数据的整个过程中都在使用着IP协议。

    Learn ,Practice ,Summary !
  • 相关阅读:
    eval(data)和eval("("+data+")")的区别
    来自 119.*.*.*的回复: TTL 传输中过期
    小伙伴们,我们一起奋斗吧
    计算机专业学习课程推荐
    sysbench使用教程【转载】
    Docker学习笔记 — Docker私有仓库搭建【转载】
    Linux设置静态IP【转】
    聊一聊PV和并发、以及计算web服务器的数量的方法【转】
    Linux常用Shell脚本珍藏【转载】
    戏说云计算之PaaS,IaaS,SaaS【转载】
  • 原文地址:https://www.cnblogs.com/daminzhou/p/8257185.html
Copyright © 2011-2022 走看看