题解 | #牛群定位系统#

牛群定位系统

https://www.nowcoder.com/practice/d808aaa4c13c4d38bff333aa796e6a1e

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param board char字符型二维数组
     * @param words string字符串一维数组
     * @return string字符串一维数组
     */
    private int[][] dirs = new int[][] {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    private Set<String> res = new HashSet<>();
    private int m, n;
    private char[][] board;
    private boolean[][] visited;

    public String[] findWords (char[][] board, String[] words) {
        // write code here
        m = board.length;
        n = board[0].length;
        this.board = board;
        visited = new boolean[m][n];
        for (String word : words) {
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    backTracking(word, 0, i, j);
                }
            }
        }
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < words.length; i++) {
            map.put(words[i], i);
        }
        List list = new ArrayList<>(res);
        Collections.sort(list, (o1, o2) -> (map.get(o1) - map.get(o2)));
        String[] ans = new String[list.size()];
        for (int i = 0; i < res.size(); i++) {
            ans[i] = String.valueOf(list.get(i));
        }
        return ans;
    }

    private void backTracking(String word, int index, int x, int y) {
        if (x < 0 || x >= m || y < 0 || y >= n || visited[x][y] ||
                word.charAt(index) != board[x][y]) {
            return;
        }
        if (index == word.length() - 1) {
            res.add(word);
            return;
        }
        visited[x][y] = true;
        for (int[] dir : dirs) {
            backTracking(word, index + 1, x + dir[0], y + dir[1]);
        }
        visited[x][y] = false;
    }
}

知识点:

回溯

解题分析:

一个普通的回溯寻找路径的问题,但是这道题的难点在于细节的处理上。题目要求找出符合要求的字符串,这就不同于普通的回溯,要找出所有的字符串,故我们使用Set集合来存储符合条件的字符串即可。还有一个点在于输出顺序并非是普通的按字典序排列,题目要求输出顺序为数组中的出现顺序,故我们需要使用一个Map来对数组中的字符串赋予权重,以便后续对结果的排序

编程语言:

Java

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务