京东笔试9.17 Java

第一题 提取年份 9%

有AC的同学麻烦让我瞅一眼。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * DESCRIPTION: 提取字符串中的年份 年份范围在 [1000, 3999] 之间
 * 输入一行英语, 比如 20% of people hold 80% of the offer in 2020 and 2019 and 2018 and 2017.
 * 刚开始利用正则表达式提取出了年份吧,然后只通过 9%,这个时候就开始找自己的错误了,毕竟题目说是单词中的年份啊。
 * 然后就开始想英语中哪些介词后面直接跟年份呢? in、by、at、on 这些都想了一下也下手了。
 * 然后系统提示增加用例,大概是 3743432sdajda2020,然后输出的结果是 2020。
 * 这我就不能理解了,2020这怎么就直接判断出年份了呢?看来没用介词,然后我就去测啊,我的也输出了 2020。
 * <p>
 * 唉,算了 9% 就 9% 吧,没时间去看了,9月25要考的优化方法都要挂了。
 **/
public class Main1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String string = in.nextLine();
        List<Integer> years = findYear(string);
        for (int i = 0; i < years.size() - 1; i++) {
            System.out.print(years.get(i) + " ");
        }
        System.out.println(years.get(years.size() - 1));
    }

    private static List<Integer> findYear(String string) {
        List<Integer> res = new ArrayList<>();
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher(string);
        while (m.find()) {
            int num = Integer.parseInt(m.group());
            if (num >= 1000 && num <= 3999) {
                res.add(num);
            }
        }
        return res;
    }
}

第二题 王子找公主 AC

import java.util.Scanner;

/**
 * DESCRIPTION: 王子找公主
 * 王子为 S,E 为公主,# 表示障碍,. 表示可走动
 * <p>
 * 花了差不多二十分钟的时间来调输入.
 * <p>
 * ***!
 **/
public class Main2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        while (T-- > 0) {
            int rows = in.nextInt();
            int cols = in.nextInt();
            char[][] grid = new char[rows][cols];
            for (int row = 0; row < rows; row++) {
                String s = in.next();
                for (int j = 0; j < s.length(); j++) {
                    grid[row][j] = s.charAt(j);
                }
            }
            System.out.println(princeAndPrincess(grid) ? "YES" : "NO");
        }
    }

    private static boolean princeAndPrincess(char[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) return false;
        boolean res = false;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 'S') { // 如果找到王子了
                    res = dfs(i, j, grid);
                }
            }
        }
        return res;
    }

    private static boolean dfs(int x, int y, char[][] grid) {
        if (!inArea(grid, x, y) || grid[x][y] == '#') return false; // 如果越界或者走不通

        if (grid[x][y] == 'E') return true; // 找到公主

        grid[x][y] = '#'; // 已走过的标记为障碍

        boolean res;
        res = dfs(x + 1, y, grid) ||
                dfs(x - 1, y, grid) ||
                dfs(x, y + 1, grid) ||
                dfs(x, y - 1, grid);

        grid[x][y] = '.'; // 重新标记成可以走动的路
        return res;
    }

    private static boolean inArea(char[][] grid, int i, int j) {
        return 0 <= i && i < grid.length && 0 <= j && j < grid[0].length;
    }
}
#笔试题目##京东#
全部评论
感觉你第一题直接输出示例也是9.。。
点赞 回复
分享
发布于 2020-09-17 21:46
我复制了楼主的第一题的代码,我在键盘乱擦,结果数组越界
点赞 回复
分享
发布于 2020-09-17 21:56
饿了么
校招火热招聘中
官网直投
用一个int来记录当前可能为年份的值curYear,初始0,如果遇到的ch是数字,那么curYear = curYear * 10 + (ch-‘0’),如果遇到的是非数字,判断当前的curYear是否在1000到3999之间,是的话打印,否则将curYear归零
点赞 回复
分享
发布于 2020-09-17 21:56
我也是1.09不知道有没有面试
点赞 回复
分享
发布于 2020-09-17 22:22

相关推荐

2 7 评论
分享
牛客网
牛客企业服务