A.与对应负数同时存在的最大正整数
思路:标记即可
class Solution {
public:
int findMaxK(vector<int>& v) {
int n = v.size();
map<int, bool> mp;
for (int i = 0; i < n; i ++ ) mp[v[i]] = true;
sort(v.begin(), v.end(), greater<int>());
for (int i = 0; i < n; i ++ ){
if(mp[v[i]] && mp[-v[i]]){
return v[i];
break;
}
}
return -1;
}
};
B:反转之后不同整数的数目
思路:模拟+set(sort 后去重速度不如set)
class Solution {
public:
int countDistinctIntegers(vector<int>& v) {
int n = v.size();
for (int i = 0; i < n; i ++ ){
int t = v[i];
int sum = 0;
while(t){
sum = sum * 10 + t % 10;
t /= 10;
}
v.push_back(sum);
}
for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
set<int> s;
for (auto x : v ) s.insert(x);
return s.size();
}
};
C:反转之后的数字和
思路:暴力枚举 + c++的stoi(字符串转数字)
class Solution {
public:
bool sumOfNumberAndReverse(int k) {
for (int i = 0; i <= k; i ++ ){
string s = to_string(i);
reverse(s.begin(), s.end());
if(i + stoi(s) == k) return true;
}
return false;
}
};
D: 统计定界子数组的数目
思路:显然不满足区间mink和maxk的数字是不满足条件的!所以可以分成若干个区间,然后再区间内求答案。当我们固定了某个区间的右端点后, 找出离我们最近的一个j,满足[i, j]这个区间中是mink和maxk的, 那么答案就可以加上一个j - last + 1;
class Solution {
public:
long long countSubarrays(vector<int>& nums, int minK, int maxK) {
long long res = 0;
int smax = 0, smin = 0;
for (int i = 0, j = 0, last = 0; i < nums.size(); i ++ ){//枚举右端点i,当满足区间[j, i]中既有mink也有maxk的res
if(nums[i] < minK || nums[i] > maxK){
j = last = i + 1;//当前位置不合法,重新寻找区间
smax = smin = 0;//清空
continue;
}
if (nums[i] == minK) smin ++ ;
if (nums[i] == maxK) smax ++ ;
while(j <= i){//找出最近的离i满足的区间,那么j - last + 1,这些位置就会全部满足了
if(nums[j] == minK) smin --;
if(nums[j] == maxK) smax --;//如果当前位置向后走,如果等于就要改变
if(!smin || !smax){//说明不满足条件,j不能向后走
if(nums[j] == minK) smin ++;
if(nums[j] == maxK) smax ++;//回滚操作!
break;
}
j ++;
}
if(smin && smax) res += j - last + 1;
}
return res;
}
};