zoukankan      html  css  js  c++  java
  • LeetCode 第 32 场双周赛

    手速过慢,手感不稳,挂 4 发。

    1539.第 k 个缺失的正整数

    题目链接:1539.第 k 个缺失的正整数

    给你一个 严格升序排列 的正整数数组 arr 和一个整数 k

    请你找到这个数组里第 k 个缺失的正整数。

    示例 Sample

    示例 1:

    输入: arr = [2,3,4,7,11], k = 5
    输出: 9
    解释: 缺失的正整数包括 [1,5,6,8,9,10,12,13,...] 。第 5 个缺失的正整数为 9 。

    示例 2:

    输入: arr = [1,2,3,4], k = 2
    输出: 6
    解释: 缺失的正整数包括 [5,6,7,...] 。第 2 个缺失的正整数为 6 。

    提示:

    • 1 <= arr.length <= 1000
    • 1 <= arr[i] <= 1000
    • 1 <= k <= 1000
    • 对于所有 1 <= i < j <= arr.lengthij 满足 arr[i] < arr[j]

    我的题解

    class Solution {
     public:
      int findKthPositive(vector<int>& arr, int k) {
        vector<bool>vis(arr.size() + k + 1);
        for(int i = 0; i < arr.size(); i++)
          if(arr[i] < vis.size())
            vis[arr[i]] = true;
        for(int i = 1, c = 0; i < vis.size(); i++) {
          if(!vis[i])
            c++;
          if(c == k)
            return i;
        }
        return vis.size();
      }
    };
    

    1540.K 次操作转变字符串

    题目链接:1540.K 次操作转变字符串

    给你两个字符串 st ,你的目标是在 k 次操作以内把字符串 s 转变成 t

    在第 i 次操作时(1 <= i <= k),你可以选择进行如下操作:

    • 选择字符串 s 中满足 1 <= j <= s.length 且之前未被选过的任意下标 j (下标从 1 开始),并将此位置的字符切换 i 次。
    • 不进行任何操作。

    切换 1 次字符的意思是用字母表中该字母的下一个字母替换它(字母表环状接起来,所以 'z' 切换后会变成 'a')。

    请记住任意一个下标 j 最多只能被操作 1 次。

    如果在不超过 k 次操作内可以把字符串 s 转变成 t ,那么请你返回 true ,否则请你返回 false

    示例 Sample

    示例 1:

    输入: s = "input", t = "ouput", k = 9
    输出: true
    解释: 第 6 次操作时,我们将 'i' 切换 6 次得到 'o' 。第 7 次操作时,我们将 'n' 切换 7 次得到 'u' 。

    示例 2:

    输入: s = "abc", t = "bcd", k = 10
    输出: false
    解释: 我们需要将每个字符切换 1 次才能得到 t 。我们可以在第 1 次操作时将 'a' 切换成 'b' ,但另外 2 个字母在剩余操作中无法再转变为 t 中对应字母。

    示例 3:

    输入: s = "aab", t = "bbb", k = 27
    输出: true
    解释: 第 1 次操作时,我们将第一个 'a' 切换 1 次得到 'b' 。在第 27 次操作时,我们将第二个字母 'a' 切换 27 次得到 'b' 。

    提示:

    • 1 <= s.length, t.length <= 10^5
    • 0 <= k <= 10^9
    • st 只包含小写英文字母。

    我的题解

    class Solution {
     public:
      bool canConvertString(string s, string t, int k) {
        if(s.length() != t.length())
          return false;
        map<int, int>vis;
        for(int i = 0, c; i < s.length(); i++) {
          if(s[i] == t[i])
            continue;
          if(s[i] < t[i])
            c = t[i] - s[i];
          else
            c = 26 - s[i] + t[i];
          if(c + vis[c] * 26 > k)
            return false;
          vis[c]++;
        }
        return true;
      }
    };
    

    1541.平衡括号字符串的最少插入次数

    题目链接:1541.平衡括号字符串的最少插入次数

    给你一个括号字符串 s ,它只包含字符 '('')' 。一个括号字符串被称为平衡的当它满足:

    • 任何左括号 '(' 必须对应两个连续的右括号 '))'
    • 左括号 '(' 必须在对应的连续两个右括号 '))' 之前。

    比方说 "())""())(())))""(())())))" 都是平衡的, ")()""()))"
    "(()))" 都是不平衡的。

    你可以在任意位置插入字符 '(' 和 ')' 使字符串平衡。

    请你返回让 s 平衡的最少插入次数。

    示例 Sample

    示例 1:

    输入: s = "(()))"
    输出: 1
    解释: 第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ')' 使字符串变成平衡字符串 "(())))" 。

    示例 2:

    输入: s = "())"
    输出: 0
    解释: 字符串已经平衡了。

    示例 3:

    输入: s = "))())("
    输出: 3
    解释: 添加 '(' 去匹配最开头的 '))' ,然后添加 '))' 去匹配最后一个 '(' 。

    示例 4:

    输入: s = "(((((("
    输出: 12
    解释: 添加 12 个 ')' 得到平衡字符串。

    示例 5:

    输入: s = ")))))))"
    输出: 5
    解释: 在字符串开头添加 4 个 '(' 并在结尾添加 1 个 ')' ,字符串变成平衡字符串 "(((())))))))" 。

    提示:

    • 1 <= s.length <= 10^5
    • s 只包含 '('')'

    我的题解

    class Solution {
     public:
    
      int gao(string &s)const {
        int l(0), r(0);
        for(int i = 0; i < s.length(); i++) {
          if(s[i] == '(')
            l++;
          else if(s[i] == ')') {
            if(l > 0)
              l--;
            else
              r++;
          }
        }
        return 2 * l + r;
      }
    
      int minInsertions(string s) {
        string t;
        int ans(0);
        for(int i = 0; i < s.length(); i++) {
          t += s[i];
          if(s[i] == ')') {
            if((i + 1 < s.length() && s[i + 1] == ')'))
              i++;
            else
              ans++;
          }
        }
        return ans + gao(t);
      }
    };
    

    1542.找出最长的超赞子字符串

    题目链接:1542.找出最长的超赞子字符串

    给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。

    「超赞子字符串」需满足满足下述两个条件:

    • 该字符串是 s 的一个非空子字符串
    • 进行任意次数的字符交换后,该字符串可以变成一个回文字符串

    示例 Sample

    示例 1:

    输入: s = "3242415"
    输出: 5
    解释: "24241" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "24142"

    示例 2:

    输入: s = "12345678"
    输出: 1

    示例 3:

    输入: s = "213123"
    输出: 6
    解释: "213123" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "231132"

    示例 4:

    输入: s = "00"
    输出: 2

    提示:

    • 1 <= s.length <= 10^5
    • s 仅由数字组成

    我的题解

    class Solution {
     public:
      int longestAwesome(string s) const {
        vector<int>a(s.length() + 1, 0);
        vector<int>g((1 << 11), -1);
        for(int i = 0; i < s.length(); i++) {
          a[i + 1] = a[i] ^ (1 << (s[i] - '0'));
        }
        int ans(0);
        for(int i = 0; i <= s.length(); i++) {
          if(g[a[i]] == -1)
            g[a[i]] = i;
          ans = max(ans, i - g[a[i]]);
          int t = a[i];
          for(int j = 0; j < 10; j++) {
            t = a[i] ^ (1 << j);
            if(g[t] != -1)
              ans = max(ans, i - g[t]);
          }
        }
    
        return ans;
      }
    };
    
  • 相关阅读:
    用户数据报协议---UDP
    斐波那契数列
    从尾到头打印链表
    Mybatis三种查询方式
    Mybatis配置
    字典的用法
    遍历列表、切片、定义元组
    与列表相关知识
    python一些方法总结
    计算机的容量
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/13500630.html
Copyright © 2011-2022 走看看