跳至主要內容

力扣第 311 场周赛

大约 2 分钟

力扣第 311 场周赛

比赛时间 2022-09-18。本场周赛国服共 2289 人 AK。

T1. 最小偶倍数(3 分)

解题思路

数学。当 n 为奇数时,答案为 2n;当 n 为偶数时,答案为 n

时间复杂度:O(1)

参考代码

class Solution {
    public int smallestEvenMultiple(int n) {
        if (n % 2 == 1) {
            return n * 2;
        }
        return n;
    }
}

T2. 最长的字母序连续子字符串的长度(4 分)

解题思路

双指针。

时间复杂度:O(n)

参考代码

class Solution {
    public int longestContinuousSubstring(String s) {
        int len = s.length();

        int max = 0;
        // 双指针。对于每个 i,找到最右的 j,长度为 j-i+1
        int i = 0;
        for (int j = i; j < len; j++) {
            if (s.charAt(j) - s.charAt(i) == j - i) {
                max = Math.max(max, j - i + 1);
            } else {
                i = j;
            }
        }
        return max;
    }
}

T3. 反转二叉树的奇数层(5 分)

解题思路

二叉树层序遍历。对奇数层节点重新赋值即可。

时间复杂度:O(n)

参考代码

class Solution {
    public TreeNode reverseOddLevels(TreeNode root) {
        int level = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            List<Integer> curLevelVal = new ArrayList<>();
            List<TreeNode> curLevelNode = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode cur = queue.remove();
                curLevelVal.add(cur.val);
                curLevelNode.add(cur);

                if (cur.left != null) {
                    queue.add(cur.left);
                }
                if (cur.right != null) {
                    queue.add(cur.right);
                }
            }

            // 奇数层节点重新赋值
            if (level % 2 == 1) {
                Collections.reverse(curLevelVal);
                for (int i = 0; i < curLevelVal.size(); i++) {
                    curLevelNode.get(i).val = curLevelVal.get(i);
                }
            }
            level++;
        }
        return root;
    }
}

T4. 字符串的前缀分数和(6 分)

解题思路

暴力时间复杂度:O(n^2*|s|)。会 TLE(听说 Python 暴力能 AC?)

Trie 字典树。

时间复杂度:O(n*|s|)

参考代码

class Solution {
    public int[] sumPrefixScores(String[] words) {
        int len = words.length;
        Trie trie = new Trie();
        for (String word : words) {
            trie.insert(word);
        }

        int[] res = new int[len];
        for (int i = 0; i < len; i++) {
            res[i] = trie.startsWith(words[i]);
        }
        return res;
    }

    private static class Trie {
        private final Trie[] children;
        // 有多少个前缀
        private int val;

        public Trie() {
            children = new Trie[26];
        }

        public void insert(String word) {
            Trie node = this;
            for (char ch : word.toCharArray()) {
                int idx = ch - 'a';
                if (node.children[idx] == null) {
                    node.children[idx] = new Trie();
                }
                node = node.children[idx];
                node.val++;
            }
        }

        public int startsWith(String prefix) {
            int res = 0;
            Trie node = this;
            for (char ch : prefix.toCharArray()) {
                int idx = ch - 'a';
                if (node.children[idx] == null) {
                    return res;
                }
                node = node.children[idx];
                res += node.val;
            }
            return res;
        }
    }
}

(全文完)