笔试强训(二十八)

一、选择题

(1)如果希望监听TCP端口号9000,服务器端应该怎样创建socket(B)
A.new Socket(“localhost”,9000);
B.new ServerSocket(9000);
C.new Socket(9000);
D.new ServerSocket(“localhost”,9000);

服务器端创建Socket 语法: new ServerSocket(int port)
客户端连接Soceket 语法:new Socket(String host,int port)
网络编程服务器端默认在本地指定端口号监听TCP端口
new Socket(“localhost”,9000); //客户端连接端口
new ServerSocket(9000); //服务器端监听端口

(2)jre判断程序是否执行结束的标准是(A)
A.所有前台线程执行完毕
B.所有后台线程执行完毕
C.所有的线程执行完毕
D.和以上都无关

jre:Java运行时环境
jdk:Java开发工具包,包含了jre
所有的前台线程(用户线程)执行完毕,则认为程序执行完毕,一般我们创建的线程都是前台线程,可以调用setDameon(true)的方法将后台线程置为后台线程
典型的后台线程:JVM垃圾回收线程

(3)下面不属于Object类中方法的是(B)
A.hashCode()
B.finally()
C.wait()
D.toString()

finally是用来修饰代码块的
在这里插入图片描述

(4)下列哪项不属于jdk1.6垃圾回收器(D)
A.Serial收集器
B.parNew收集器
C.MS收集器
D.G1收集器

G1收集器在jdk7中才有

二、编程题

2.1 反转部分单链表

2.1.1 题目

在这里插入图片描述

2.1.2 题解

思路找到待反转区间的前驱节点和后继结点,然后反转部分区间,再将反转后后的部分区间与整体连接起来即可

代码:

import java.util.*;

class ListNode {
    int val;
    ListNode next;
    public ListNode(int val){
        this.val=val;
    }
}
public class Main{
    public static void main(String[] args){
         Scanner scanner =new Scanner(System.in);
        int n=scanner.nextInt();
        scanner.nextLine();
        String nodeVal=scanner.nextLine();
        String[] nodes=nodeVal.split(" ");
        ListNode dummy=new ListNode(-1);
        ListNode tail=dummy;
        for(int i=0;i<n;i++){
            ListNode node=new ListNode(Integer.parseInt(nodes[i]));
            tail.next=node;
            tail=tail.next;
        }
        int left =scanner.nextInt();
        int right=scanner.nextInt();
        ListNode pre=dummy;      //pre指向left的前驱节点
        ListNode r=dummy;        //r指向right节点
        for(int i=0;i< left-1;i++){
            pre=pre.next;
        }
        for(int i=0;i<right;i++){
            r=r.next;
        }
        ListNode  l=pre.next;  //l指向left节点
        ListNode cur=r.next;  //cur指向right的后继节点
        pre.next=null;     //将要反转的区间与链表整体断开
        r.next=null;
        reverse(l);   //反转部分单链表
        pre.next=r;  //将反转后的部分单链表与整体连接
        l.next=cur;
        ListNode head=dummy.next;
        while(head!=null){
            System.out.print(head.val+" ");
            head=head.next;
        }
    }
  
  //反转链表
    public  static ListNode reverse(ListNode head){
       
        ListNode pre=null;
        ListNode cur=head;
        while(cur!=null){
            ListNode curNext=cur.next;
            cur.next=pre;
            pre=cur;
            cur=curNext;
        }
        return pre;
    }
}

【注意】:输入的处理

题目说明第一行输入一个整数,第二行输入若干整数,其中两个数之间用空格隔开,如果我们先用nextInt方法接收第一个行的整数,然后接着用nextLine接收第二行的若干整数,就会导致nextLine只能接收到第一行输入的换行符,因此我们需要在第一行通过nextInt接收完之后,使用单独的nextLine处理掉多余的换行符。然后再次使用nextLine接收第二行的若干整数
在这里插入图片描述
**加粗样式**

2.2 猴子分桃

2.2.1 题目

在这里插入图片描述

2.2.2 题解

思路因为每次分5堆都会多出来1个,所以我们借给猴子们4个,以致每次都可以刚好分成5堆,并且,每次给老猴子的桃子都不在我们借出的那4个中,这样最后减掉4就可以得到结果。
在这里插入图片描述

  • 第一个猴子得到(x+4)/5,剩余(x+4)(4/5)个
  • 第二个猴子分完后剩余(x+4) (4/5)^2个
  • 第三个猴子分完后剩余(x+4) (4/5)^3个
  • 依次类推,第n个猴子分完后剩余(x+4)(4/5)^n
  • 要满足最后剩余的为整数,并且x最小,则当 x+4=5^n时,满足要求;此时,x=5 ^ n - 4;
  • 老猴子最后得到的数量为:n个猴子分完后剩余的数量-4+n,-4是因为要从剩余的桃子中拿出4个还回去,+n是每个猴子在分的过程中都会给老猴子一个,
  • 即(x+4)*(4/5) ^ n + n - 4 = 4^n + n - 4

代码:

  public static void main(String[] args){
   Scanner scanner=new Scanner(System.in);
       while(scanner.hasNextInt()){
       int n=scanner.nextInt();
          if(n==0) break;
       long sum=(long)Math.pow(5,n)-4;
       long  ret=(long)Math.pow(4,n)+n-4;
       System.out.println(sum+" "+ret);
       }
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值