• 【Leetcode周赛】从contest-71开始。(一般是10个contest写一篇文章)


    Contest 71 ()

    Contest 72 ()

    Contest 73 (2019年1月30日模拟)

    链接:https://leetcode.com/contest/weekly-contest-73

    结果:2/4,会做第一题和第三题,第二题和第四题不会做。

    【788】Rotated Digits(第一题 4分)(谷歌tag)

    给了一个 good number 的定义,X is a good number if after rotating each digit individually by 180 degrees, we get a valid number that is different from X. 

    0, 1, 8旋转之后是本身,2,5旋转之后互为另一个数,6,9 同 2,5。

    给定一个 N,问 1~N 里面有多少个 good number?(N < 10000)

    题解:直接枚举。注意旋转是说 每个数字单独旋转,并不是把整个数旋转。

     1 class Solution {
     2 public:
     3     int rotatedDigits(int N) {
     4         unordered_map<int, int> mp;
     5         mp[0] = 0, mp[1] = 1, mp[8] = 8, mp[2]= 5, mp[5] = 2, mp[6] = 9, mp[9] = 6; 
     6         int ans = 0;
     7         for (int i = 1; i <= N; ++i) {
     8             string s = to_string(i);
     9             string rev = "";
    10             bool valid = true;
    11             for (auto c : s) {
    12                 if (mp.find(c-'0') == mp.end()) {
    13                     valid = false; 
    14                     break;
    15                 }
    16                 rev += string(1, mp[c-'0'] + '0');
    17             }
    18             if (valid && s != rev && rev[0] != '0') {
    19                 ans++;
    20             }
    21         }
    22         return ans;
    23     }
    24 };
    View Code

    【789】Escape The Ghosts(第二题 5分)逃离鬼魂(谷歌tag,数学题)

    假设你站在原点,有个去的目标 target 坐标,在二维平面上有一些鬼魂(鬼也有坐标)。每一步,你和鬼魂都能上下左右移动一格。问有没有可能在鬼怪抓到你之前,到达target。如果你和鬼怪同时到达target的话,那么鬼赢了。

    题解:我比赛的时候想成了比较复杂的bfs,去模拟每个位置。幸好没有写。本题的本质是只要你和target 的曼哈顿距离小于任何一个鬼怪距离target的目标距离,你就有可能会赢。所以只要判断一下距离就行了。 

     1 class Solution {
     2 public:
     3     bool escapeGhosts(vector<vector<int>>& ghosts, vector<int>& target) {
     4         const int dist = abs(target[0]) + abs(target[1]);
     5         for (auto& ele : ghosts) {
     6             int d = abs(target[0] - ele[0]) + abs(target[1] - ele[1]);
     7             if (d < dist) {
     8                 return false;
     9             }
    10         }
    11         return true;
    12     }
    13 };
    View Code

    比赛的时候理解有问题,我一直以为某个时间人和鬼都必须要移动,不能站着不动。但是总监说不能站着不动的话,这题的难度也没有增加,因为如果有个鬼到target的距离和人到target距离如果差了一步的话,人就能到target,如果差了两步的话,鬼就能先离开,然后再回到target,所以这个时候鬼赢了。

    然后还有一个变种,如果鬼不能到target,它最多在target周围四个格子,有点像猫和老鼠那题。

    【791】Custom Sort String(第三题 5分)

     给了两个字符串 S 和 T,S 定义了一种新的字母顺序,要求把 T 按照 S 定义的顺序排序。

    题解:我是先用了一个 hashmap 记录了 T 的每个字母的频次,然后再遍历一遍 S, 构造ans字符串,最后遍历hashmap中剩下的字符,组成新的字符串。

     1 class Solution {
     2 public:
     3     string customSortString(string S, string T) {
     4         const int n = T.size();
     5         unordered_map<char, int> mp;
     6         for (int i = 0; i < n; ++i) {
     7             mp[T[i]]++;
     8         }
     9         string ret;
    10         for (auto c : S) {
    11             if (mp.find(c) == mp.end() || mp[c] == 0) {continue;}
    12             ret += string(mp[c], c);
    13             mp[c] = 0;
    14         }
    15         for (auto ele : mp) {
    16             if (ele.second > 0) {
    17                 ret += string(ele.second, ele.first);
    18             }
    19         }
    20         return ret;
    21     }
    22 };
    View Code

    【790】Domino and Tromino Tiling(第四题 5分)

    给了多米诺骨牌,有两种形状,

    XX  <- domino
    
    XX  <- "L" tromino
    X

    给定一个 N 问有多少种填充方案能填满 2 * N 个格子。答案要对 1e9+7 取模。

    题解:dp做。

    Contest 74 (2019年1月31日模拟)

    链接:https://leetcode.com/contest/weekly-contest-74

    Contest 75 (2019年1月31日模拟)

    链接:https://leetcode.com/contest/weekly-contest-75

    Contest 77 (2019年2月3日模拟)

    链接:https://leetcode.com/contest/weekly-contest-77

    总结:做出来三道题。3/4

    【806】Number of Lines To Write String(第一题 4分)

    给了一个数组,数组中的元素作为 'a' ~ 'z' 的每个占位符的宽度。每行最多100个字符宽度,问给了一个字符串,返回两个数字,一个是这个字符串需要占多少行,第二个是这个字符串的最后一行有多少个字符。

    Example :
    Input: 
    widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
    S = "abcdefghijklmnopqrstuvwxyz"
    Output: [3, 60]
    Explanation: 
    All letters have the same length of 10. To write all 26 letters,
    we need two full lines and one line with 60 units.

    题解:用个 curSum 的变量记录当前行有多少个字符,当 curSum 大于 100 的时候就换行。

     1 class Solution {
     2 public:
     3     vector<int> numberOfLines(vector<int>& widths, string S) {
     4         const int n = S.size();
     5         int curLen = 0;
     6         vector<int> ans(2, 0);
     7         for (int i = 0; i < n; ++i) {
     8             curLen += widths[S[i]-'a'];
     9             if (curLen > 100) {
    10                 ans[0]++;
    11                 curLen = widths[S[i]-'a'];
    12             }
    13         }
    14         ans[0] += 1;
    15         ans[1] = curLen;
    16         return ans;
    17     }
    18 };
    View Code

    【804】Unique Morse Code Words(第二题 4分)

     给了一个数组作为 'a' 到 'z' 的摩斯码编码,给了一个 word list, 不同的单词可能有相同的莫斯码编码,返回有多少不同的摩斯码编码的种类。

    题解:遍历,用set去除重复。

     1 class Solution {
     2 public:
     3     int uniqueMorseRepresentations(vector<string>& words) {
     4         vector<string> morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
     5         set<string> st;
     6         for (auto& w : words) {
     7             string str;
     8             for (auto& c : w) {
     9                 str += morse[c - 'a'];
    10             }
    11             st.insert(str);
    12         }
    13         return (int)st.size();
    14     }
    15 };
    View Code

    【807】Max Increase to Keep City Skyline(第三题 5分)

    给了一个 二维的grid, grid[i][j] 代表 (i, j) 坐标的楼的高度,我们能从前后和左右看到两个高度的轮廓,我们的目标是增加楼的高度,但是让轮廓线不变。

    Example:
    Input: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
    Output: 35
    Explanation: 
    The grid is:
    [ [3, 0, 8, 4], 
      [2, 4, 5, 7],
      [9, 2, 6, 3],
      [0, 3, 1, 0] ]
    
    The skyline viewed from top or bottom is: [9, 4, 8, 7]
    The skyline viewed from left or right is: [8, 7, 9, 3]
    
    The grid after increasing the height of buildings without affecting skylines is:
    
    gridNew = [ [8, 4, 8, 7],
                [7, 4, 7, 7],
                [9, 4, 8, 7],
                [3, 3, 3, 3] ]

    题解:我们先计算出 top 和 left 的轮廓线,grid[i][j] 能取到的最大的高度就是 min(top[j], left[i])

     1 class Solution {
     2 public:
     3     int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
     4         const int n = grid.size(), m = grid[0].size();
     5         vector<int> fromTop(m, 0), fromLeft(n, 0);
     6         for (int i = 0; i < n; ++i) {
     7             for (int j = 0; j < m; ++j) {
     8                 fromTop[j] = max(fromTop[j], grid[i][j]);
     9                 fromLeft[i] = max(fromLeft[i], grid[i][j]);
    10             }
    11         }
    12         int ret = 0;
    13         for (int i = 0; i < n; ++i) {
    14             for (int j = 0; j < m; ++j) {
    15                 ret += min(fromTop[j], fromLeft[i]) - grid[i][j];
    16             }
    17         }
    18         return ret;
    19     }
    20 };
    View Code

    【805】Split Array With Same Average(第四题 9分)

  • 相关阅读:
    解决Docker安装慢
    Spring Boot源码分析-启动过程
    Ubuntu安装Docker
    Jenkins搭建
    Hexo搭建静态博客站点
    FactoryBean简介以及Mybatis-Spring应用
    ArrayList源码分析
    Spring AOP-用代理代替繁琐逻辑
    Spring Validation-用注解代替代码参数校验
    Netty学习(4):NIO网络编程
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/9998400.html
Copyright © 2020-2023  润新知