2 u112222222 u112222222 于 2016.04.15 20:04 提问

微软4月笔试题第二题,为什么本地运行没错,提交是RE,实在想不出来,求救!!
 import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    int allowS = 0;//rules allow数组大小
    int denyS = 0;
    ArrayList<String> allow = new ArrayList<>();//用来存放动态变化的rules,整个类都要使用,则定义为实例变量
    ArrayList<String> deny = new ArrayList<>();

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int N = input.nextInt();
        int M = input.nextInt();
        Main webser = new Main();
        if(1<=N && M<=100000){
            webser.rules(N);
            String[] output = webser.request(M);
            for(int j=0;j<output.length;j++){
                System.out.println(output[j]);
            }
            //sca.close();//写完之后就要close,否则容易忘记
        }
        input.close();

    }
    /*
     * @param n为rules个数,此方法用来封装rules
     */
    public void rules(int n){

        @SuppressWarnings("resource")
        Scanner sca = new Scanner(System.in);
        for(int i=0;i<n;i++){
            String s = sca.nextLine();
            String[] rule = s.split(" ");//返回字符串数组
            if(rule[0].equals("allow")){
                allow.add(rule[1]);
                allowS++;
            }else if(rule[0].equals("deny")){
                deny.add(rule[1]);
                denyS++;
            }
        }
        //sca.close();如果把这个流关闭了,再调用request方法中的输入流就不行了
    }
    public String[] request(int m){
        //开始匹配,最优的应该是用正则表达式匹配,稍后优化
        String[] output1 = new String[m];//没问题
        String[] requ = new String[m];//创建请求数组
        @SuppressWarnings("resource")
        Scanner sca = new Scanner(System.in);
        for(int i=0;i<m;i++){       
            requ[i] = sca.nextLine();//输入请求ip数组
        }
        //开始遍历每一次request是否符合命中rules
        circle:
        for(int j=0;j<m;j++){
            for(int k=0;k<allow.size();k++){
                if(requ[j].equals(allow.get(k))){
                    output1[j] = "YES";//return "YES";
                    continue circle;
                }else if(allow.get(k).contains("/")){
                    String requBinary =IPtoInt.ipToint(requ[j]); 
                    String[] allowip = allow.get(k).split("/");
                    int mask =Integer.parseInt(allowip[1]);//取位数
                    String allowstr = IPtoInt.ipToint(allowip[0]);
                    //String allowMask = allowstr.substring(0,mask);//变成字符串后,取前几位
                    if(requBinary.substring(0, mask).equals(allowstr.substring(0,mask))){
                        output1[j] = "YES";//return "YES";
                        continue circle;

                    }
                }
            }
            for(int k=0;k<deny.size();k++){
                if(requ[j].equals(deny.get(k))){
                    output1[j] = "NO";//return "NO";
                    continue circle;
                }else if(deny.get(k).contains("/")){
                    String requBinary = IPtoInt.ipToint(requ[j]);
                    String[] denyip = deny.get(k).split("/");
                    int mask = Integer.parseInt(denyip[1]);
                    String denystr = IPtoInt.ipToint(denyip[0]);
                    String denyMask = denystr.substring(0,mask);
                    if((requBinary.substring(0,mask)).equals(denyMask)){//必须对比前mask位
                        output1[j] = "NO";//return "NO";
                        continue circle;
                    }
                }
            }
            if(output1[j].length()==0)
                output1[j] = "YES";

        }       
        //sca.close();
        return output1;//返回字符串数组      
    }
}
class IPtoInt {
    // 重写了方法,将ip地址转换为二进制。
    public static String ipToint(String strIP) {
        String[] ip = new String[4];
        String zero = "00000000";//用来补位的
        String[] ipstr = strIP.split("\\.");
        // 将每个.之间的字符串转换成整型
        ip[0] = Integer.toBinaryString(Integer.parseInt(ipstr[0]));
        ip[1] = Integer.toBinaryString(Integer.parseInt(ipstr[1]));
        ip[2] = Integer.toBinaryString(Integer.parseInt(ipstr[2]));
        ip[3] = Integer.toBinaryString(Integer.parseInt(ipstr[3]));
        for(int i=0;i<4;i++){
            if(ip[i].length()<8){
                ip[i] =zero.substring(0,8-ip[i].length()) + ip[i];//如果每一段ip不足八位,那么用字符串加法高位补0,不用循环,一次性补0,因为ip.length()一直会变  
            }
        }
        return ip[0]+ip[1]+ip[2]+ip[3];
    }
 } 


1个回答

devmiao
devmiao   Ds   Rxr 2016.04.15 23:44
u112222222
u112222222 haha,谢谢,我忘记关这个问题了
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
微软亚洲研究院2017年笔试编程题
微亚编程题能看得出好可怕呀感觉要求ACM金牌什么的才可能 不过很多都是ai部分的 从题目可以看得出来.
2016微软校招笔试题
标题A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters , output all its lucky non-empty substrings in l
2017.4.8微软笔试题
微软笔试题第一题时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There are N queens in an infinite chessboard. We say two queens may attack each other if they are in the same vertical line, horizontal line or diagon
CCF 2017_12月考试第2题解析
游戏   有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。   游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小
小米2015笔试第二题
小米2015笔试第一题求两个多项式乘积的问题相信大家在中学时经常碰到,它是这样的一个问题: pa=an*x^n + an-1*x^(n-1) + … + a1*x + a0 pa=bm*x^m + bn-1*x^(m-1) + … + b1*x + b0 其中,an, an-1, …,a0, bm, bm-1, … ,b0 都是整数,范围[-10000, 10000]。0<=n, m <=10
2017年4月21日华为笔试题 德州扑克
2017年华为笔试题 德州扑克
2018美团点评内推笔试编程题2
老师不想自己改试卷,于是让大家互相改试卷。 把全班同学分为k组,每组有s(k)个同学, 老师先选择一个组i,将这个组的所有试卷s(i)份都收上来放在讲台上 然后再选择一个组j,从讲台上拿s(j)份试卷随机分给j组的同学,然后把j组的所有试卷收上来,放在讲台上试卷的最下方 ……重复上述过程, 最后把剩余的试卷随机分给i组的s(i)个同学。 但是这样分配试卷是有缺陷的,比如: 1.有可能
一道八进制的编程题,在本地运行结果正常,在牛客网提交编译提示输出错误
一道八进制的编程题,在本地运行结果正常,在牛客网提交编译提示输出错误     题目描述 输入一个整数,将其转换成八进制数输出。  输入描述: 输入包括一个整数N(0。   输出描述: 可能有多组测试数据,对于每组数据, 输出N的八进制表示数。 输入例子: 7 8 9   输出例子: 7 10 11   代码:           1 im
2017微软秋季校园招聘在线编程笔试-#1400 : Composition
http://hihocoder.com/problemset/problem/1400 题意理解:有限制的两个不能相邻,i之和前面剩下的那一个相关,所以可以f【i】【ch】的动态规划去做,每次转移考虑删不删i的字符 急转弯:想到i只和前面一个相关,并且可以记录下来。 算法:无 数据结构:无 # # 'f' __author__ = 'hjkrucli
微软2016实习生笔试--第三题Demo Day
微软2016校园招聘4月在线笔试题解(三) Sat 09 April 2016 by ictlxb Filed under C/CPP Tags cpp algorithm hihocoder If all you have is a hammer, everything looks like a nail. ---Maslow C. Demo Day Problem 时间限