LeetCode 第 14 场双周赛

基础的 api 还是不够熟悉啊

5112. 十六进制魔术数字

class Solution {
 public:
  char *lltoa(long long num, char *str, int radix) {
    const char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    unsigned long long unum;
    int i = 0, j, k;
    if(radix == 10 && num < 0) {
      unum = (unsigned) - num;
      str[i++] = '-';
    } else
      unum = (unsigned long long)num;
    do {
      str[i++] = index[unum % (unsigned)radix];
      unum /= radix;
    } while(unum);
    str[i] = '\0';

    if(str[0] == '-')
      k = 1;
    else
      k = 0;
    char temp;
    for(j = k; j <= (i - k - 1) / 2.0; j++) {
      temp = str[j];
      str[j] = str[i - j - 1];
      str[i - j - 1] = temp;
    }
    return str;
  }

  string toHexspeak(string num) {
    long long val = atoll(num.c_str());
    char str[1024];
    lltoa(val, str, 16);
    num = string(str);
    //cout <<val <<"\n"<< str << "\n" <<num << "\n";
    for(int i = 0, sz = num.length(); i < sz; ++i) {
      if(num[i] == '0')
        num[i] = 'O';
      else if(num[i] == '1')
        num[i] = 'I';
    }
    string ans = num;
    for(int i = 0, sz = num.length(); i < sz; ++i) {
      if(num[i] >= 'A' && num[i] <= 'Z')
        continue;
      ans = "ERROR";
    }
    return ans;
  }
};

一时没有想起 atollsprintf 等函数,写得很暴力。 long long 16 进制输出可用 %llX

class Solution {
 public:
  string toHexspeak(string num) {
    long long val = atoll(num.c_str());
    char str[100];
    sprintf(str, "%llX", val);
    for(int i = 0, sz = strlen(str); i < sz; ++i)
      if(str[i] == '1')
        str[i] = 'I';
      else if(str[i] == '0')
        str[i] = 'O';
      else if(str[i] > '0' && str[i] <= '9') {
        string ans("ERROR");
        return ans;
      }
    string ans = string(str);
    return ans;
  }
};

5113. 删除区间

留意区间交集是一个点的情况。

#define PB push_back
class Solution {
 public:
  vector<vector<int>> removeInterval(vector<vector<int>>& intervals, vector<int>& toBeRemoved) {
    vector<vector<int>> ans;
    for(vector<int> interval : intervals) {
      if(interval[0] >= toBeRemoved[1] || (interval[1] <= toBeRemoved[0])) {
        ans.PB(interval);
      } else if(toBeRemoved[0] < interval[0]) {
        if(toBeRemoved[1] >= interval[1])
          continue;
        else if(toBeRemoved[1] < interval[1])
          ans.PB(vector<int> {toBeRemoved[1], interval[1]});
      } else if(toBeRemoved[0] < interval[1]) {
        if(toBeRemoved[1] < interval[1]) {
          if(interval[0] != toBeRemoved[0])
            ans.PB(vector<int> {interval[0], toBeRemoved[0]});
          if(toBeRemoved[1] != interval[1])
            ans.PB(vector<int> {toBeRemoved[1], interval[1]});
        } else if(toBeRemoved[1] >= interval[1]) {
          if(interval[0] != toBeRemoved[0])
            ans.PB(vector<int> {interval[0], toBeRemoved[0]});
        }
      }
    }
    return ans;
  }
};

5114. 删除树节点

#define PB push_back

typedef pair<int, int> PII;

class Solution {
 public:
  static const int maxn = 1e4 + 7;
  vector<int> g[maxn];
  int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {
    int root(-1);
    for(int i = 0; i < nodes; ++i) {
      if(parent[i] == -1)
        root = i;
      else
        g[parent[i]].PB(i);
    }
    return DFS(value, root).second;
  }

  PII DFS(vector<int>&value, int root) {
    PII ans({value[root], 1}); //{values,size}
    for(int u : g[root]) {
      PII sub = DFS(value, u);
      if(sub.first != 0)
        ans.first += sub.first, ans.second += sub.second;
    }
    return ans;
  }

};

5136. 矩形内船只的数目

划分成 4 块或者 块+线 的情况。

/**
 * // This is Sea's API interface.
 * // You should not implement it, or speculate about its implementation
 * class Sea {
 *   public:
 *     bool hasShips(vector<int> topRight, vector<int> bottomLeft);
 * };
 */

class Solution {
 public:

  int countShips(Sea sea, vector<int> topRight, vector<int> bottomLeft) {
    int ans(0);
    if(topRight[0] == bottomLeft[0] && topRight[1] == bottomLeft[1]) {
      return sea.hasShips(topRight, bottomLeft) ? 1 : 0;
    } else if(!sea.hasShips(topRight, bottomLeft)) {
      return 0;
    }
    if(bottomLeft[0] < topRight[0] && bottomLeft[1] < topRight[1]) {
      int mx = (topRight[0] + bottomLeft[0]) / 2, my = (topRight[1] + bottomLeft[1]) / 2;
      ans = countShips(sea, vector<int> {mx, my}, bottomLeft)
            + countShips(sea, vector<int> {mx, topRight[1]}, vector<int> {bottomLeft[0], my + 1})
            + countShips(sea, topRight, vector<int> {mx + 1, my + 1})
            + countShips(sea, vector<int> {topRight[0], my}, vector<int> {mx + 1, bottomLeft[1]});

    } else if(bottomLeft[0] == topRight[0]) {
      int my = (topRight[1] + bottomLeft[1]) / 2;
      ans += countShips(sea, vector<int> {bottomLeft[0], my}, bottomLeft)
      + countShips(sea, topRight, vector<int> {bottomLeft[0], my + 1});
    } else if(bottomLeft[1] == topRight[1]) {
      int mx = (topRight[0] + bottomLeft[0]) / 2;
      ans = countShips(sea, vector<int> {mx, bottomLeft[1]}, bottomLeft)
      + countShips(sea, topRight, vector<int> {mx + 1, bottomLeft[1]});
    }
    return ans;
  }
};

原文地址:https://www.cnblogs.com/Forgenvueory/p/11964864.html

时间: 2024-11-08 19:15:14

LeetCode 第 14 场双周赛的相关文章

第19场双周赛总结

2020-02-10 5311. 将数字变成 0 的操作次数 给你一个非负整数 num ,请你返回将它变成 0 所需要的步数. 如果当前数字是偶数,你需要把它除以 2 :否则,减去 1 . class Solution { public: int numberOfSteps (int num) { int count = 0; while(num){ if(num &1) num--; else num /= 2; count++; } return count; } }; 1343. 大小为

LeetCode双周赛10

Leetcode双周赛10 5079.三个有序数组的交集 给出三个均为 严格递增排列 的整数数组 arr1,arr2 和 arr3. 返回一个由 仅 在这三个数组中 同时出现 的整数所构成的有序数组. 示例: 输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8] 输出: [1,5] 解释: 只有 1 和 5 同时在这三个数组中出现. 提示: 1 <= arr1.length, arr2.length, arr3.length

LeetCode 第 165 场周赛

LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能说数据不充分 找出井字棋的获胜者4 题目描述 Description A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "

Leetcode 第174场周赛 题解

Leetcode 第174场周赛 题解 方阵中战斗力最弱的 K 行 签到题,统计一下每行的军人数量,然后设置一下排序规则即可. 时间复杂度 \(O(nlogn)\) typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i --) #define INF 0x3f3f3f3f3f3f3f3

Leetcode 第175场周赛 题解(完结)

Leetcode 第175场周赛 题解 检查整数及其两倍数是否存在 数据范围小的可怜,\(O(n^2)\) 解法可行.如果范围大一点,可以先进行排序然后遍历每一个数进行二分查找,时间复杂度 \(O(nlogn)\) 代码是平方解法. typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i

LeetCode 第 183 场周赛

LeetCode 第 183 场周赛 非递增顺序的最小子序列 降序排列后,往 vector<int>ans 中添加元素,直到其和超过所有元素和的一半. class Solution { public: vector<int> minSubsequence(vector<int>& nums) { const int n = nums.size(); sort(nums.begin(), nums.end(), greater<int>()); int

Win7上安装Ubuntu 麒麟14.04双系统简要步骤

1,官网下载iso文件 2,安装Deamon Tool Lite虚拟光驱.加载iso文件 3,自动运行该光驱,设置安装在哪个盘,以及系统大小 4,默认安装,前提是需要联网,否则可能安装不成功 5,安装完成,出现双系统菜单,选择Ubuntu,可能出现为/检查磁盘时发生严重错误的提示 6,网上搜索解决方法,只需要吧启动配置文件的ro修改为rw即可启动,进入系统后,再次修改文件,使之永久修改 7,成功安装完成 Win7上安装Ubuntu 麒麟14.04双系统简要步骤

LeetCode第136场周赛

菜鸡我只做出了一道... 5055. 困于环中的机器人 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方.机器人可以接受下列三条指令之一: "G":直走 1 个单位 "L":左转 90 度 "R":右转 90 度 机器人按顺序执行指令 instructions,并一直重复它们. 只有在平面中存在环使得机器人永远无法离开时,返回 true.否则,返回 false. 提示: 1 <= instructions.length <=

[leetcode 双周赛 11] 1228 等差数列中缺失的数字

1228 Missing Number In Arithmetic Progression 等差数列中缺失的数字 问题描述 有一个数组, 其中的值符合等差数列的数值规律, 也就是说: 在?0 <= i < arr.length - 1?的前提下, arr[i+1] - arr[i]?的值都相等. 我们会从该数组中删除一个 既不是第一个 也 不是最后一个的值, 得到一个新的数组??arr. 给你这个缺值的数组?arr, 请你帮忙找出被删除的那个数. 示例 1: 输入: arr = [5,7,11