多益网络笔试

今天要参加多益网络的笔试,索性在网络上搜了一下该贵公司的试题。
看到了一哥们发的这样一个题目,原文地址参见这里。看了一下该哥们的答案,感觉过于复杂,并且也没有得到相应的答案。就自己写了一下。
题目如下:

给定一个数x(x>5),找到该数与3、4之间的关系。关系如下:x=3*n+4*m,然后找到|n-m|的最小值。
其中:
6=3*2+4*0
7=3*1+4*1
8=3*0+4*2
9=3*3+4*0

分析:求n-m的绝对值,其实就是3和4数量的差值。不妨设个每多一个3就让结果+1,每多一个4就让结果-1。按照这种思路:题目就可以理解为:

6=3*2+4*0 最小值为:1+1=2 即一个3就是一个1 两个3就是两个1,没有4就不用-1
7=3*1+4*1 最小值为:1-1=0 即一个3,一个4,1+(-1)=0
8=3*0+4*2 最小值为:-1-1=-2 即没有3,两个4,(-1)+(-1)=-2
9=3*3+4*0 最小值为 1+1+1=3 ,三个3,1+1+1=3
这里所说的所有最小值都是没有加绝对值前的最小值,例如8的最小值用-2,而不用2,后面再详细介绍

剩下的就开始有规律了。
当x=10
10=6+4=7+3
从6+4 可知,10的最小值是1-1=0,因为6的最小值为1,再加上一个4,也就是在最小值里加上一个-1 所有就是1-1=0;
从7+3可知,10的最小值是0+1=1,因为7的最小值为0,再加上一个3,也就是在最小值里加上一个1,所以就是0+1=1;
然后从6+3和7+1得出的最小值里选一个更小的;
从而得出一个公式:

F(n)=min(|F(n-3)+1|,|F(n-4)-1|)
说明:这个公式其实并没有那么准确,F(n)并不一定是正数,最小值也并不是真正意义上的最小值,最小值在这里的意思是在 F(n-3)+1,F(n-4)-1 这两个可能有正有负的数中,在未来的结果中是最优值的原本值。可能越解释越复杂,说几个例子
在1,3中,最小值为1
在-1,-3中,最小值为-1
在1,-3中,最小值为1
说白了,就是在两个数的比较中,先比较他们的绝对值大小,把绝对值小的原数返回,如何还不能理解,可以看下面代码中的函数:int min(int x,int y)

很显然,这是一个递归解决的问题。忽然发现,这跟斐波那契数列的公式很像,是的,你没看错,这其实就是它的一个变形。

接下来开始验证:
当x=11
11=7+4=8+3 从 7的最小值-1 与 8的最小值+1 中选出一个最小值即为11的最小值
7的最小值为0,0-1=-1
8的最小值为-2,-2+1=-1
-1=-1 所以11的最小值为-1,因为11=3*1+4*2,真正的最小值为1 ,上边公式中的最小值为-1,结果没错
当x=12
12=8+4=9+3 从 8的最小值-1 与 9的最小值+1 中选出一个最小值 即为12的最小值
8的最小值为-2 ,-2-1=-3
9的最小值为3,3+1=4
根据上边公式中的解释,12的最小值为-3,也就是12=3*0+4*3时最小值为3,公式中的结果为-3 ,结果没错
当13=9+4=10+3 从9的最小值-1 与10的最小值+1 中选出一个最小值
9的最小值为3 3-1=2
10的最小值为1,上边已经算过了,1+1=2
2==2 所以13的最小值为2 , 也就是13=3*3+4*1 |3-1|=1+1+1-1=2 结果依然没错



有了这个公式剩下的就开始明朗起来,直接套公式解决就OK了。当然里面还会有几个坑。

为什么8的最小值不能直接写成2,而暂时还要用-2表示???
因为我们在计算过程中是前面已算过的值进行的改装,例如算11的时候,是用7和8的结果基础上得出的11的最优解,再加上对加3和加4做了类比,化成了+1,-1,而这些又刚好对正负敏感,所以在编程过程中在判断大小的时候,切记要在比较完大小以后,返回原来的相对应得可能是负数的值,但其实质结果就是最小值,只是没有加绝对值。

按照公式,写出如下代码

package hans.xin;

public class duoyi {

    public static void main(String[] args) {
        int x=12;
        int bqn = bqn (x);//得到一个未加绝对值的最优解
        System.out.println (bqn>0?bqn:-bqn);//在输出的时候相当于绝对值
    }

//用递归来返回相应的未被绝对值的‘最小值’
    public static int bqn(int x){
        if(x==6) return 2;
        if(x==7) return 0;
        if(x==8) return -2;//-2就是因为+1,-1对正负敏感,后续可能也有正负,也需要8来做铺垫。
        if(x==9) return 3;
        return min(bqn (x-4)-1,bqn (x-3)+1);
    }

//返回最小值函数,这里所说的最小值并非跳出题目的最小值,而是未来有望做最优解的未被绝对值的‘最小值’
    public static int min(int x,int y){
        int absX=Math.abs (x);//获取绝对值函数
        int absY=Math.abs (y);
        if(absX>absY){//这里要格外注意一下
            return y;//当判断得知未来的最佳结果(也就是绝对值最小)以后,返回原来传过来的数,而并非绝对值以后的数
        }else{
            return x;
        }
    }
}

如果你已经理解了,那么现在就开始去敲着尝试一下吧,可能会另有收获。切记不要复制粘贴哦。这里面的坑不敲一下看不出来的。

下面放一下今天笔试我遇到的编程题
大致意思:

我们公司为了安全起见,需要对我们的内部管理系统添加ip限制,以防止其他外部ip侵入出现安全隐患。
1.编写代码,获取请求的ip地址并判断是否能够访问系统,如果能够访问,返回true,如果不能访问,返回false;
2.公司的网段为 112.61.157.0/24 61.135.112.159/32 163.147.124.0/26
3.写出详细的思路,并完成代码,没有思路不给分。

wtf,我该怎么办,我也很无奈,计算机网络一年半前的课了,早都抛到脑后去了,划分子网早都忘得一干二净了。
我回答的思路:
1.ip获取:通过请求得到的HttpServletRequest可以通过getHeader(“x-forwarded-for”)得到ip
2.划分子网,得到ip对应的返回(计算我现在还没学会,可能后续补充,当时也没写,因为不会( ╯□╰ ))
3.通过正则表达式表示相应的ip区间,然后匹配1中所求的ip
4.如果匹配成功,返回true, 匹配失败返回false.
这是我当时的回答,如果有大神知道这道题怎么解,望告知。拜拜了您类。

The more I share, the more I have.
如有建议或错误,欢迎指正。联系方式h1096938190@163.com.
I love technology.And you?

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值