文章

每日LeetCode 166-168

2021.5.11 ・ 共 945 字,您可能需要 2 分钟阅读

Tags: LeetCode

09

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

class CQueue {
    LinkedList<Integer> a, b;
    public CQueue() {
        a = new LinkedList<>();
        b = new LinkedList<>();
    }
    
    public void appendTail(int value) {
        a.addLast(value);
    }
    
    public int deleteHead() {
        if (!b.isEmpty()) {
            return b.removeLast();
        }
        if (a.isEmpty()) {
            return -1;
        }
        while (!a.isEmpty()) {
            b.addLast(a.removeLast());
        }
        return b.removeLast();
    }
}

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof

class Solution {
    boolean[][] visited;
    public boolean exist(char[][] board, String word) {
        boolean ans = false;
        visited = new boolean[board.length][board[0].length];
        for (int i = 0; i < board.length; i++) {
            for (int j = 0;  j < board[0].length;j++) {
                ans = backTrack(board, word, visited, i, j, 0);
                if (ans == true) {
                    return ans;
                }
            }
        }
        return ans;
    }

    public boolean backTrack(char[][] board, String word, boolean[][] visited, int i, int j, int index) {
        if (board[i][j] != word.charAt(index)) {
            return false;
        } else if (index == word.length() - 1) {
            return true;
        }
        boolean ans = false;
        visited[i][j] = true;
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] step : directions) {
            if (i + step[0] >= 0 && i + step[0] < board.length && j + step[1] >= 0 && j + step[1] < board[0].length && !visited[i + step[0]][j + step[1]]) {
                ans = backTrack(board, word, visited, i + step[0], j + step[1], index + 1);
                if (ans == true) {
                    return ans;
                }
            }
        }
        visited[i][j] = false;
        return ans;
    }
}

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

示例 1:

输入:m = 2, n = 3, k = 1 输出:3

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof

class Solution {
    int ans = 0;
    public int movingCount(int m, int n, int k) {
        boolean visited[][] = new boolean[m][n];
        backTrack(m, n, k, visited, 0, 0);
        return ans;
    }

    public void backTrack(int m, int n, int k, boolean[][] visited, int i, int j) {
        if (ans >= m * n || getSum(i) + getSum(j) > k || visited[i][j] == true) {
            return;
        }
        ans++;
        visited[i][j] = true;
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for(int[] step : directions) {
            int newI = i + step[0];
            int newJ = j + step[1];
            if (newI >= 0 && newI <= m - 1 && newJ >= 0 && newJ <= n - 1 && visited[newI][newJ] == false) {
                backTrack(m, n, k, visited, newI, newJ);
            }
        }

    }

    public int getSum(int x){
        int res = 0;
        while (x > 0) {
            res += x % 10;
            x /= 10;
        }
        return res;
    }
}