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] <= 1000nums[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 <= 1051 <= 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 <= 1051 <= 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;
}
};