【LeetCode】第 315 场周赛题解

121 阅读2分钟

6204. 与对应负数同时存在的最大正整数

给你一个 不包含 任何零的整数数组 nums ,找出自身与对应的负数都在数组中存在的最大正整数 k 。

返回正整数 **k ,如果不存在这样的整数,返回 -1 。

 

示例 1:

输入: nums = [-1,2,-3,3]
输出: 3
解释: 3 是数组中唯一一个满足题目要求的 k 。

示例 2:

输入: nums = [-1,10,6,7,-7,1]
输出: 7
解释: 数组中存在 1 和 7 对应的负数,7 的值更大。

示例 3:

输入: nums = [-10,8,6,7,-2,-3]
输出: -1
解释: 不存在满足题目要求的 k ,返回 -1 。

 

提示:

  • 1 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • nums[i] != 0

题解 : 哈希表

class Solution {
public:
    int findMaxK(vector<int>& nums) {
       unordered_map<int, int> hash;
       for(auto c : nums) {
           hash[c]++;
       } 
       int res = -1;
       for(auto [k,v] : hash){
           if(hash.count(k) && hash.count(-k)){
               res = max(res, k);
           }
       }
      return res;
    }
};

6205. 反转之后不同整数的数目

给你一个由  整数组成的数组 nums 。

你必须取出数组中的每个整数,反转其中每个数位,并将反转后得到的数字添加到数组的末尾。这一操作只针对 nums 中原有的整数执行。

返回结果数组中 不同 整数的数目。

 

示例 1:

输入: nums = [1,13,10,12,31]
输出: 6
解释: 反转每个数字后,结果数组是 [1,13,10,12,31,1,31,1,21,13] 。
反转后得到的数字添加到数组的末尾并按斜体加粗表示。注意对于整数 10 ,反转之后会变成 01 ,即 1 。
数组中不同整数的数目为 6(数字 1、10、12、13、21 和 31)。

示例 2:

输入: nums = [2,2,2]
输出: 1
解释: 反转每个数字后,结果数组是 [2,2,2,2,2,2] 。
数组中不同整数的数目为 1(数字 2)。

 

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 106

题解:模拟

class Solution {
public:
    int get(int num){
        int res = 0;
        while(num){
            res = res*10+num%10;
            num/=10;
        }
        return res;
    }
    int countDistinctIntegers(vector<int>& nums) {
        unordered_set<int> S;
        for(auto c : nums) {
            S.insert(c);
            S.insert(get(c));
        }
        return S.size();
    }
};

6219. 反转之后的数字和

给你一个 非负 整数 num 。如果存在某个 非负 整数 k 满足 k + reverse(k) = num  ,则返回 true ;否则,返回 **false 。

reverse(k) 表示 k 反转每个数位后得到的数字。

 

示例 1:

输入: num = 443
输出: true
解释: 172 + 271 = 443 ,所以返回 true

示例 2:

输入: num = 63
输出: false
解释: 63 不能表示为非负整数及其反转后数字之和,返回 false

示例 3:

输入: num = 181
输出: true
解释: 140 + 041 = 181 ,所以返回 true 。注意,反转后的数字可能包含前导零。

 

提示:

  • 0 <= num <= 105 题解: 模拟
class Solution {
public:
    int get(int num){
        int res = 0;
        while(num){
            res = res*10+num%10;
            num = num/10;
        }
        return res;
    }
    bool sumOfNumberAndReverse(int num) {
        for(int k=0; k<=num; k++){
            if(k+get(k) == num){
                return true;
            }
        }
        return false;
    }
};

6207. 统计定界子数组的数目

给你一个整数数组 nums 和两个整数 minK 以及 maxK 。

nums 的定界子数组是满足下述条件的一个子数组:

  • 子数组中的 最小值 等于 minK 。
  • 子数组中的 最大值 等于 maxK 。

返回定界子数组的数目。

子数组是数组中的一个连续部分。

 

示例 1:

输入: nums = [1,3,5,2,7,5], minK = 1, maxK = 5
输出: 2
解释: 定界子数组是 [1,3,5][1,3,5,2]

示例 2:

输入: nums = [1,1,1,1], minK = 1, maxK = 1
输出: 10
解释: nums 的每个子数组都是一个定界子数组。共有 10 个子数组。

 

提示:

  • 2 <= nums.length <= 105
  • 1 <= nums[i], minK, maxK <= 106

题解:双指针

class Solution {
public:
    long long countSubarrays(vector<int>& nums, int minK, int maxK) {
        long long res = 0;
        int maxp = -1, minp = -1, last = 0 , n = nums.size();
        for(int i=0; i<n; i++){
            if(nums[i] == minK) minp = i;
            if(nums[i] == maxK) maxp = i;
            if(nums[i] < minK || nums[i] > maxK){
                last = i+1;
            }
            res += max(min(minp, maxp) - last +1, 0);
        }
        return res;
    }
};