2020校招搜狗笔试编程题01

2020校招搜狗笔试编程题01

今天晚上进行了搜狗校招笔试第二场,第一题是解答题,题目是给出一段代码张找出其中的错误部分并解释。

第一题难度不是很大,程序是c++写的,对于我一个太久没写c++代码来说,看到还是有点懵比,没反应过来,特别是指针部分。也让我知道了自己的缺点。

第二题与第三题是编程题,鄙人不才,一题没有做出来,实在是很垃圾,于是来这里总结一下。第一题题目大致还有点印象,但是看题目时就看了好久,没反应过来。第二题看题目机会都没有。哎,看来自己的算法真的很垃圾。

不过没事,第一题编程题我好像考试结束后做出来了,不知道对于错。但是我还是打算写出来,警示自己。

题目

题目好像叫什么ip匹配。

(我根据我理解写的题目,不一定与原来意思相同,全凭自己理解,多多包涵)

给出一个一组ip匹配规则,规则是 .225.,.225.225,225.225.,..225,等规则,* 不能出现在中间。

然后给出一组ip与ip规则组进行匹配。*可以与任意字符匹配。

输入:

5 3
*.224.*
*.114.224
*.115.224
11.115.*
222.*.*
111.223.111
222.2224.444
111.115.222

输入:

0 1 0

说明:

输入的第一行5,3,分别是输入5个ip匹配规则,输入3个IP。

输出第一个数表示第一条ip(111.223.111)与过多少个ip匹配规则匹配。

输出第二个数表示第二条ip(222.2224.444)与过多少个ip匹配规则匹配。

输出第三个数表示第三条ip(111.115.222)与过多少个ip匹配规则匹配。

我的解题思路:

本题解题难点我认为主要在匹配上面,其他都是小简单。那我就先说说我的一开始匹配思路:

当时我就想到用字符串来保存IP,就直接把IP转换为char数组来一个接一个字符进行匹配(是不是觉得我特别的沙雕,对啊,的确沙雕),在我后面编写代码时候我才发现一个问题,ip是以 " . "分隔开的,我完全可以使用分割函数啊。于是有了第二种解决方法,显然,我在第一种解决方法上浪费了大量时间,第二种方法大概写出来了,但是时间也不够了。

第二种解题思路就是将ip 字符串以点 “ . ” 进行分割,返回一个字符数组,然后两个自己数组逐渐比较,当不满足时直接返回false.表示不匹配。

当然,这里要注意的是,用点分割,需要转义。

代码:

package cn.bubbletg;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author www.bubbletg.cn * BubbleTg
 * @version 1.0
 * @date 2019/9/16 19:24
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //输入多少条匹配规则
        int N = in.nextInt();
        //输入多少条匹配ip
        int M = in.nextInt();

        String[] string = new String[N];
        String[] strings = new String[M];
        //输入匹配规则
        for (int i = 0; i < N; i++) {
            string[i] = in.next();
        }
        //输入ip
        for (int i = 0; i < M; i++) {
            strings[i] = in.next();
        }

        pipei(string, strings);
    }

    /**
     *  匹配输入函数
     * @param string
     * @param strings
     */
    private static void pipei(String[] string, String[] strings) {
        //匹配数,用来记录输入,及匹配数
        int pishu[] = new int[strings.length];

        //双重循环比较
        for (int i = 0; i < strings.length; i++) {
            for (int j = 0; j < string.length; j++) {

                //判断是否匹配
                String s1 = strings[i];
                String s2 = string[j];
                //进行匹配,匹配返回true
                if (pipeis(s2, s1)) {
                    //记录
                    pishu[i]++;
                }
            }

        }
        //输出结果
        for (int i = 0; i < pishu.length; i++) {
            System.out.printf(pishu[i] + " ");
        }


    }
    /**
     * 两个字符串匹配
     *
     * @param s1
     * @param s2
     * @return
     */
    private static boolean pipeis(String s1, String s2) {
        //截取字符串
        String[] st1 = s1.split("\\.");
        String[] st2 = s2.split("\\.");
        //匹配
        for (int i = 0; i < st1.length;) {
            //由于* 与其他都匹配,所以当为* 时,数组下表直接往后移动
            if (st1[i].equals("*")) {
                i++;
            } else if (st1[i].equals( st2[i])) {
                //当不是* 时,如果两个字符串不想等,说明不匹配,相对往后移动,i++
                i++;
            } else {
                return false;
            }
        }
        return true;

    }
}

你可能感兴趣的:(java)