下面记录了一些,我觉得自己没答好或者没有写出来的题,并在后面写了一下思路。笔试时间2018-06-26
1.10000!后有几个0?
思路:5的倍数和2的倍数相乘会产生0,而2的倍数是多于5的倍数的,因此算出有多少个5的倍数即可。10000/5=2000,10000/5^2=400,10000/5^3=80,10000/5^4=16,[10000/5^5]=3。总和为2499个0
2.a的ASCII码97,A是65.
3.TCP如何保证可靠性?、
TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
(1) 超时重传。TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。
(2)校验和。TCP将保证首部和数据的校验和,这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果校验和出错,将丢弃该报文,且不做响应,等待超时重传。
(3)TCP收到另一端的数据,它会发送一个确认。这个确认不是立即发送,而是推迟很小的时间,可能是对包做校验。
(4)通过序列号保证数据以正确的顺序交给应用层
(5)能够丢弃重复数据。
(6)TCP是面向有连接,在交换数据前必须先建立连接,从而保证对端存在
(7)TCP提供了流量控制。TCP连接的每一方都有固定大小的缓冲区,为了防止较快主机致使较慢主机的缓冲区溢出,可以采用滑动窗口的方式来避免这种现象产生。
4.for(;;)和while(true)有哪些不同?
(1)编译后的字节码不同
(2)for的指令少,并且不会占用寄存器;此外,不需要每次都进行判断。
(3)虽然两者语义相同,由于for的底层更加简洁,通常源码中都采用这种方式“死循环”
5.算法题:三阶方阵,如何保证每行之和、每列之和以及对角线之和都相等。
思路:这个题对于任意的奇数阶方阵都有相同的方法来求解。
代码如下:
package offer0627; /** * @author ChenXu * 题目:给定任意n奇数阶方阵以及1~n*n,如何将数字放入其中保证各行各列以及对角线之和相等 * 思路: * (1)从1~n*n一顺填,首先将1放在第一行的中间,然后下一个数字2放在上一个数字的右上方 * (2)如果出界了,也就是想象上下是连接在一起的,左右也是连接在一起的 * (3)如果所属的位置已有元素,则放在上一个数的下面 * */ public class MagicSquare { private static int[][] fillMagicSquare(int n) { int a=n*n; int A[][]=new int[n][n]; //使用i,j完成当前点的判断 //使用c,d记录上一个点的坐标 int c=0,d=n/2; int i=c,j=d; for(int b=1;b<=n*n;b++) { A[c][d]=b; //取右上,只有可能i,j同时出界,或分别出界 i--;j++; //i,j同时出界 if(i<0 && j==n) { i=n-1; j=0; } //分别出界 if(i<0) i=n-1; if(j==n) j=0; //如果已有元素,则放在之前数字的下方 if(A[i][j]!=0) { i=(c+1)%n; j=d; } c=i;d=j; } return A; } private static void printSquare(int[][] A) { for(int i=0;i<A.length;i++) { for(int j=0;j<A[0].length;j++) { System.out.print(A[i][j]+" "); } System.out.println(""); } } public static void main(String[] args) { int n=4; if(n%2!=0) { int A[][]=fillMagicSquare(n); printSquare(A); }else { System.out.println("偶数次方阵,需要使用其他方式"); } } }
6.秒杀活动考虑的因素
记得之前有看过淘宝专家许令波写的一篇文章《淘宝大秒系统设计详解》:https://blog.csdn.net/heyc861221/article/details/80122167
主要是对系统架构提出了一些优化的通用原则,主要包括:
- 热点隔离(多个层次的隔离,以及提前识别的热点数据和实热点发现)
- 动静分离(web系统的静态化改造,缓存和CDN,基于时间分片峰值,Localcache)
- 数据分层校验(漏斗式设计过滤掉无效的请求,对读不做强一致性校验,对写做强一致性校验,限流和保护)
作者的水平比较高,我只读懂了部分,建议读他的原文,观摩大神~
网上还有一些,可以参考看看:
7.线程和进程分别是什么,以及区别?
(1)定义:
- 进程指的是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
- 线程:是进程的一个实体,是操作系统调度的最小单元。线程自己基本不拥有系统资源,只拥有一点运行时必不可少的资源(如程序计数器、寄存器和栈),但是它可以和同属一个进程的其他线程共享进程所拥有的全部资源。
(2)区别:
- 一个线程只能属于一个进程,但是一个进程可以拥有多个线程
- 线程是一种轻量级进程,与进程相比,线程的创建,维护和管理带来的负担小于进程,因此线程的代价或开销比较小
- 线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
- 进程在执行过程中拥有独立的内存单元,而多个线程则是共享内存
- 对于通信来说,进程需要建立通信链路来通信,而线程间通信则通过读取和写入共享变量到主内存来完成通信
8.instanceof的用法
用来指出对象是否是特定类或接口的一个实例,有三种情况会返回true:
(1)对象是该类的实例(2)对象是该类子类的实例(3)对象是继承该接口类的实例
package offer0627; interface People { void eat(); } class Person implements People{ public void eat() {} } class XiaoMing extends Person{ } public class testInstance{ public static void main(String[] args) { Person p=new Person(); XiaoMing xm=new XiaoMing(); System.out.println(p instanceof People); System.out.println(p instanceof XiaoMing); System.out.println(xm instanceof People); System.out.println(xm instanceof Person); } }