美图大数据岗笔试题二

来源:互联网 发布:电脑安装ubuntu双系统 编辑:程序博客网 时间:2024/05/22 02:07

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

(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)

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

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

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

原创粉丝点击