T1去掉最低工资和最高工资后的工资平均值
签到题,直接写。
class Solution {
public:
double average(vector<int>& salary) {
int n = salary.size();
double sum = 0;
int ma = -INT_MAX, mi = INT_MAX;
for(int i = 0; i < n; i++)
{
ma = max(ma, salary[i]);
mi = min(mi, salary[i]);
sum += salary[i];
}
sum -= (mi + ma);
sum /= n - 2;
return sum;
}
};
T2 n 的第 k 个因子
维护n的因子数组arr,然后队尾就是答案。
class Solution {
public:
int kthFactor(int n, int k) {
vector<int> arr;
for(int i = 1; i <= n; i++)
if( n % i == 0 )
arr.push_back(i);
int m = arr.size();
if(k > m)
return -1;
else
return arr[k-1];
}
};
T3 删掉一个元素以后全为 1 的最长子数组
题意很简单,去找一个最长的全1子串,这个子串中最多包含一个0。如果直接去写,可以用双指针,外层循环枚举左指针l,内层循环去枚举右指针r,在合法范围内尽量远地去推进r。最后答案就是最长的子串长度-1(去掉那个0)。这样做的复杂度最坏是O(n²)。
这里我采用的是O(n)的做法。
首先对串进行状态压缩,累加每个全1串,然后去枚举每一个0左右数字之和,找到最大的那个值,就是答案。
class Solution {
public:
int longestSubarray(vector<int>& nums) {
vector<int> arr;
vector<int> pos;
//状态压缩
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] == 1)
{
int tmp = 0;
while(nums[i] == 1)
{
tmp++;
i++;
}
i--;
arr.push_back(tmp);
}
else
{
arr.push_back(0);
}
}
//找到每个零的位置
for(int i = 0; i < arr.size(); i++)
if(arr[i] == 0)
pos.push_back(i);
//枚举左右和
int maxn = -INT_MAX;
for(int i = 0; i < pos.size(); i++)
{
if(pos[i] != 0 && pos[i] != arr.size() - 1)
{
int tmp = arr[pos[i]-1] + arr[pos[i]+1];
maxn = max(tmp, maxn);
}
}
if(maxn == -INT_MAX)
return nums.size() - 1;
return maxn;
}
};