美图大数据岗笔试题二

# 原创作品,转载请注明出处,谢谢!@杨福星

(http://blog.csdn.net/luckystar92/article/details)


一、题目介绍

【根据输入的IP信息库,查询特定某一IP所属位置】

题目背景介绍


二、分析

 考虑运用顺序表存储数据

三、编程实现

MeiTu_Main .java

package companyTopic;
import java.util.Scanner;

/**
 * 此类为顺序表 美图编程IP查询
 * 
 * @author yangfuxing
 *
 */
public class MeiTU_Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入限定顺序表的最大长度:\t");
        SLType SL = new SLType(sc.nextInt());
        SL.SLInit(SL);
        System.out.print("请输入需要录入的IP信息库的数据条数:\t");
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            DATA data = new DATA();
            data.IP_start = sc.next();
            data.IP_end = sc.next();
            data.country = sc.next();
            data.province = sc.next();
            SL.SLAdd(SL, data);
        }
        System.out.println("信息库录入完毕,请开始查询:");
        while (true) {
            String ip = sc.next();
            DATA data = SL.SLFindByKey(SL, ip);
            if (data == null) {
                System.out.println("未识别");
            } else {
                System.out.println(data.country + " " + data.province);
            }
        }

    }

}

/**
 * 定义节点
 * 
 * @author yangfuxing
 *
 */
class DATA {
    /**
     * 定义结点关键字
     */
    String IP_start;
    String IP_end;
    String country;// 国家
    String province;// 省份
}

/**
 * 定义顺序表结构
 * 
 * @author yangfuxing
 *
 */
class SLType {
    /**
     * @param mAXLEN
     */
    public SLType(int mAXLEN) {
        super();
        MAXLEN = mAXLEN;
        ListData = new DATA[MAXLEN + 1];
    }

    /**
     * 定义顺序表的最大长度
     */
    int MAXLEN;
    /**
     * 保存顺序表的结构数组,数组下标从1开始至MAXLEN,下标0弃置不用
     */
    DATA[] ListData;
    /**
     * 顺序表已存结点的数量
     */
    int ListLen;

    /**
     * 初始化顺序表
     */
    void SLInit(SLType SL) {
        SL.ListLen = 0;// 初始化为空表
    }

    /**
     * 计算顺序表元素的数量
     * 
     * @return 元素数量:ListLen
     */
    int SLLength(SLType SL) {
        return (SL.ListLen);
    }

    /**
     * 插入结点
     * 
     * @param SL
     *            顺序表
     * @param n
     *            结点序号
     * @param data
     *            结点元素
     * @return boolean值:返回插入是否成功
     */
    boolean SLInsertList(SLType SL, int n, DATA data) {

        if (SL.ListLen >= MAXLEN) {// 顺序表结点数量已超过最大数量
            System.out.print("顺序表已满,不能插入结点\n");
            return false;
        }
        if (n < 1 || n > SL.ListLen) {// 插入结点序号不正确
            System.out.print("插入结点序号不正确,不能插入结点\n");
            return false;
        }
        for (int i = SL.ListLen; i >= n; i--) {
            SL.ListData[i + 1] = SL.ListData[i];
        }
        SL.ListData[n] = data;
        SL.ListLen++;
        return true;
    }

    boolean SLAdd(SLType SL, DATA data) {
        if (SL.ListLen >= MAXLEN) {
            System.out.print("顺序表已满,无法追加!\n");
            return false;
        }
        SL.ListData[++SL.ListLen] = data;
        return true;
    }

    /**
     * 根据序号i获取顺序表SL的节点元素
     * 
     * @param SL
     *            :顺序表
     * @param n
     *            :序号
     * @return 序号i对应的节点
     */
    DATA SLFindByNum(SLType SL, int n) {
        if (n < 1 || n > SL.ListLen) {// 序号从1开始,DATA[0]弃置未用
            System.out.print("输入序错误,不能返回结点\n");
            return null;
        }

        return SL.ListData[n];
    }

    /**
     * 通过关键字ip查找结点元素
     * 
     * @param SL
     * @param key
     * @return
     */
    DATA SLFindByKey(SLType SL, String ip) {
        String[] str = ip.split("\\.");
        for (int i = 0; i < 4; i++) {
            if (str[i].length() < 3) {
                String ss = "";
                for (int j = 0; j < 3 - str[i].length(); j++) {
                    ss += "0";
                }
                str[i] = ss + str[i];
            }
        }

        String s = str[0] + str[1] + str[2] + str[3];
        long l = Long.valueOf(s);
        DATA data = null;

        for (int i = 1; i <= SL.ListLen; i++) {
            String[] str1 = SL.SLFindByNum(SL, i).IP_start.split("\\.");
            String s1 = str1[0] + str1[1] + str1[2] + str1[3];
            long l1 = Long.valueOf(s1);

            String[] str2 = SL.SLFindByNum(SL, i).IP_end.split("\\.");
            String s2 = str2[0] + str2[1] + str2[2] + str2[3];
            long l2 = Long.valueOf(s2);

            if ((l >= l1) && (l <= l2)) {// find
                data = SL.SLFindByNum(SL, i);
                break;
            }
        }
        return data;
    }
}


四、结束语

*阿星的博客(http://blog.csdn.net/luckystar92)

*此笔记谨供情况相似者参考!

*欢迎交流学习!博主知识浅薄,希望有不对的地方能得到您的指正!谢谢!^_^

**转载请注明出处,谢谢!!!

猜你喜欢

转载自blog.csdn.net/luckystar92/article/details/77847824