火力全开

阿里巴巴2017实习生笔试题(一)

这里写图片描述

感觉怪怪的,为什么没有考java部分,语言类考的都是c或者c++。

完全不能够幸福啊!

错误分类

语言:3
算法:1
网络:2
逻辑:3

京东2016实习生招聘笔试真题-技术岗位选择题A

这里写图片描述

个人感觉:该题参考价值不大,都是一些零碎的知识,跟阿里的题对比缺乏系统性。

FIFO页面淘汰算法和LRU算法不同的是,FIFO算法遇到命中的不进行替换直接使用原来的。

https://www.nowcoder.com/test/question/done?tid=6928478&qid=72103#summary

Java工程师能力评估

这里写图片描述

网易有道2017内推选择题

这里写图片描述

在一个文本中找for出现的次数:

grep for test.txt  | wc -l

更多的关于wc的命令请看:wc命令

腾讯2016研发工程师笔试题(三)

这里写图片描述

TCP正常建立连接与断开状态

这里写图片描述

根据MAC地址查找对应的IP地址是RARP协议完成的
把公网的IP地址转换为私网的IP地址是NAT协议完成的
集中管理网络中的IP地址分配是DHCP协议完成的
ICMP协议用于控制数据报传送中的差错情况

在linux编程中,以下哪个TCP的套接字选项与nagle算法的开启和关闭有关?

当有一个TCP数据段不足MSS,比如要发送700Byte数据,MSS为1460Byte的情况。nagle算法会延迟这个数据段的发送,等待,直到有足够的数据填充成一个完整数据段。也许有人会问,这有什么影响呢?没有太大的影响,总体上来说,这种措施能节省不必要的资源消耗。但是要发送的总体数据很小时,这种措施就是拖后腿了。比如,用户请求一个网页,大约十几KB的数据,TCP先发送了八九个数据包,剩下几百字节一直不发送,要等到另一个RTT才发送,这时候前面发送数据的ACK已经返回了。这样的用户体验是很不好的。 所以,现在很多服务器都选择主动关闭nagle算法,因为带宽够大,资源消耗不是问题,速度反而是个大问题。
从上述描述中,禁用 nagle,实质就是不在延迟 TCP_NODELAY

数据库

定义:

主键 – 唯一标识一条记录,不能有重复的,不允许为空

外键 – 表的外键是另一表的主键 , 外键可以有重复的 , 可以是空值

索引 – 该字段没有重复值,但可以有一个空值

作用:

主键 – 用来保证数据完整性

外键 – 用来和其他表建立联系用的

索引 – 是提高查询排序的速度

个数:

主键 – 主键只能有一个

外键 – 一个表可以有多个外键

索引 – 一个表可以有多个唯一索引

应该多练一练编程题啊!感觉好渣!

除了牛客网上的题,还可以看看leetcode上的sInterview Question

2015小米暑期实习笔试题

1.世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?

第一题比较简单,直接写:

public class Solution {
    /**
     * 获得两个整形二进制表达位数不同的数量
     *
     * @param m 整数m
     * @param n 整数n
     * @return 整型
     */
    public int countBitDiff(int m, int n) {
        int result = m^n;
        int count=0;
        while(result!=0){
            if(result%2!=0){
                count++;
            }
            result/=2;
        }
        return count;
    }
}

2.给定股票价格,求最多两次买卖时,最大化该收益。

跟leetcode上题一样:Best Time to Buy and Sell Stock III

解法一,很简洁,但我体会不到其中的思想:

The thinking is simple and is inspired by the best solution from Single Number II (I read through the discussion after I use DP).
Assume we only have 0 money at first;
4 Variables to maintain some interested ‘ceilings’ so far:
The maximum of if we’ve just buy 1st stock, if we’ve just sold 1nd stock, if we’ve just buy 2nd stock, if we’ve just sold 2nd stock.
Very simple code too and work well. I have to say the logic is simple than those in Single Number II.

public class Solution {
    public int maxProfit(int[] prices) {
        int hold1 = Integer.MIN_VALUE, hold2 = Integer.MIN_VALUE;
        int release1 = 0, release2 = 0;
        for(int i:prices){                              // Assume we only have 0 money at first
            release2 = Math.max(release2, hold2+i);     // The maximum if we've just sold 2nd stock so far.
            hold2    = Math.max(hold2,    release1-i);  // The maximum if we've just buy  2nd stock so far.
            release1 = Math.max(release1, hold1+i);     // The maximum if we've just sold 1nd stock so far.
            hold1    = Math.max(hold1,    -i);          // The maximum if we've just buy  1st stock so far. 
        }
        return release2; ///Since release1 is initiated as 0, so release2 will always higher than release1.
    }
}

解法二,用DP做,应该是比较正常的思路,参考A clean DP solution which generalizes to k transactions,用DP求解。

DP求解需要把问题定义清楚,dp数组表示什么?

这里dp[k][i]数组表示到index=i为止(不包含i),在最多k次交易中,收到的最大话的收益!

有了清晰的问题定义,那么来看转移方程:

在index = i时,我们有两种选择:
1.不做交易,此时dp[k][i] = dp[k][i-1]
2.做交易,此时dp[k][i] = dp[k-1][j]+price[i]-price[j],j属于[0,i-1]

所以,综合来看:

dp[k][i] = max{dp[k][i-1],dp[k-1][j]+price[i]-price[j]}

参考:https://discuss.leetcode.com/topic/4766/a-clean-dp-solution-which-generalizes-to-k-transactions/2

看:https://www.nowcoder.com/test/question/done?tid=6969320&qid=23494#summary

阿里巴巴2015实习生笔试题

这里写图片描述

关于循环队列,参考循环队列

对于循环队列的难点是,难点就是判断队空、队满,以及计算队列长度。

其实 big endian 是指低地址存放最高有效字节( MSB ),而 little endian 则是低地址存放最低有效字节( LSB )。 所有网络协议也都是采用 big endian 的方式来传输数据的。所以有时我们也会把 big endian 方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进 行传输。

0x1234其实是0x00001234,不要当成了0x12340000了。0x1234中12是高位,34是低位。采用MSB比较符合人类习惯。

在N个乱序数字中查找第k大的数字,时间复杂度可以减小至:

答案解析:
解法1:我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。

解法2:利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)

解法3:利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:

  1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;

  2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)

解法4:二分[Smin,Smax]查找结果X,统计X在数组中出现,且整个数组中比X大的数目为k-1的数即为第k大数。时间复杂度平均情况为O(n*logn)

解法5:用O(4*n)的方法对原数组建最大堆,然后pop出k次即可。时间复杂度为O(4*n + k*logn)

解法6:维护一个k大小的最小堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则,弹出堆顶,将当前值插入到堆中。时间复杂度O(n * logk)

解法7:利用hash保存数组中元素Si出现的次数,利用计数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值