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;
      }
    };
    
  • 相关阅读:
    防删没什么意思啊,直接写废你~
    绝大多数情况下,没有解决不了的问题,只有因为平时缺少练习而惧怕问题的复杂度,畏惧的心理让我们选择避让,采取并不那么好的方案去解决问题
    Java 模拟面试题
    Crossthread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on
    一步步从数据库备份恢复SharePoint Portal Server 2003
    【转】理解 JavaScript 闭包
    Just For Fun
    The database schema is too old to perform this operation in this SharePoint cluster. Please upgrade the database and...
    Hello World!
    使用filter筛选刚体碰撞
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/13500630.html
Copyright © 2011-2022 走看看