summary_2019/4/4

Q:c语言中的const的含义与实现机制

A:const用来说明定义的变量是只读的,这些在编译期间完成,编译器可能使用常数直接替换掉对此变量的引用

★引申:const和final以及static的区别和联系

 

Q:买200返100优惠券,实际上折扣是多少?

A:200元实际上买了300的东西 :r=200/300

 

Q:tcp三次握手的过程,accept发生在三次握手哪个阶段?

A:tcp三次握手发生在客户端与服务器要建立连接时,accept发生在三次握手之后。

第一次握手:客户端发生syn报文(syn=1)到服务器,并置发送序号为x(seq=x)。

第二次握手,服务器收到syn包,发送syn和ack报文(sny=1,ack=x+1),并置发送序号为y(seq=y),在确认序号为x+1。

第三次握手,客户端收到服务器发来的syn和ack报文,向服务器发送ack报文(ack=y+1),并置发送序号为z,在确认序号为y+1.

三次握手完成后,客户端与服务器端建立tcp连接,这时可以调用accept函数获得此连接。

 

Q:用UDP协议通讯时怎样得知目标机是否获得了数据包。

A:1:可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int。

      2:发送方在发送数据时将此id和发送时间记录在本地。

      3:接收方在接收到数据后将ID再发送给发送方作为回应。

      4:发送方如果收到回应,则知道接收方已经收到相应的数据包。如果再指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,知道确定对方收到。

 

Q:统计论坛在线人数分布:

        假设有一个论坛,其注册id达到2亿,每个id从登陆到退出会向日志文件中记录时间,写一个算法,统计一天内论坛用户在线分布,取样的粒度为s

A: 一天有多少秒s:3600*24=86400s,则准备一个长度为86400的int型数组 int detail[86400],为人数变化值,可为正或负,初始化为0.

读取日志文件每个用户的登陆和推出时间,与登陆时间对用的整数+1,与推出时间的整数-1. 遍历一遍后数组中存在的是每秒的人数变化情况。

再准备一个int online_num[86400]数组,统计每秒在线人数,初始刚开始论坛人数为0,则第一秒的人数为onlin_num[1]=detail[0],第n+1s人数为

!!!!!!!!!!!!!!  online_num[n]=online[n-1]+detail[n]

 

Q:从10G个数中找到中数,居于中间位置的数。在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

A:呃呃呃呃呃呃

 

Q:两个整数集合A和B,求其交集。

A:1,读取整数集合A中的整数,将读到的整数插入到map中,并将对应的值设为1。

2,读取整数集合B中的整数,如果该整数在map中并且值为1,则将此数加入到交集当中,并将在map中的对应值改为2。

3.!!!!!!!!!!通过更改map中的值,避免了将同样的值输出两次。

 

Q:找出1到10w中没有出现的两个数字。有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?

A:1,申请10w个bit的空间,每个bit代表一个数字是否出现过。

2,开始时将这10w个bit都初始化为0,表示所有数字都没有出现过。

3,然后依次读入已经打乱循序的数字,并将对应的bit设为1。

4,当处理完所有数字后,根据为0的bit得出没有出现的数字。

 

Q:需要多少只小白鼠才能在24小时内找到毒药:

有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?

A:题考察的是二进制。2的10次方等于1024,1024以内的所有自然数都可以用10个数位的二进制数表示出来。1000 <= 1024,此题可解.

第一步:将1000瓶水从water[0]到water[999]分别进行编号,并转化成10个数位的二进制数表示.

第二步:将10只老鼠从mouse[0]到mouse[9]进行编号  

第三步:根据老鼠的存活情况判定有毒水方法  

  1. import java.util.Scanner;

  2.  
  3. public class Main {

  4. public static void main(String[] args) {

  5. Scanner cin = new Scanner(System.in);

  6. int n = cin.nextInt();

  7. String s = null;

  8. StringBuilder str = new StringBuilder();

  9. System.out.println("请输入死掉的老鼠,死了输入1,活着输入0");

  10. for (int i = 0; i &lt; n; ++i) {

  11. s = cin.next();

  12. str.append(s);

  13. }

  14. cin.close();

  15. String s1 = str.toString();

  16. System.out.println("第" + !!!!!Integer.valueOf(s1, 2)!!!!!! + "瓶水有毒");

  17. }

  18. }

//Q:根据上排的数填写下排的数,并满足要求。

//根据上排给出十个数,在其下排填出对应的十个数, 要求下排每个数都是上排对应位置的数在下排出现的次数。上排的数:0,1,2,3,4,5,6,7,8,9。

 

Q:判断数字是否出现在40亿个数中?给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中?

2^32算出超过40亿,申请连续的2^32/8=512M的内存,每一个bit对应一个unsigned int数字。首先将512M内存都初始化为0,然后每处理一个数字就将其对应的bit设置为1。当需要查询时,直接找到对应bit,看其值是0还是1即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值