今日头条第二道编程题
代码与测试:
#include <iostream>
#include <vector>
#include <stack>
#include <time.h>
#include <algorithm>
using namespace std;
int vecSum(vector<int> &num, int i, int j)//计算num[i]到num[j]的和
{
int sum=0;
for (int k = i; k <= j; k++) {
sum += num[k];
}
return sum;
}
int incr_stack(vector<int> &num) {//单调栈实现
stack<int> s;
int sum = 0;
int maxSum = INT_MIN;
int n = num.size();
for (int i = 0; i<n; i++) {
if (s.empty() || num[i] >=num[s.top()]) {
s.push(i);
}
else {
while (!s.empty() && num[s.top()] >=num[i]) {
int top = s.top();
s.pop();
int tmp=s.empty()? vecSum(num, 0, i-1) : vecSum(num, s.top()+ 1, i - 1);
int curSum = num[top]*tmp;
maxSum = max(curSum, maxSum);
}
s.push(i);
}
}
while (!s.empty()) {
int top = s.top();
s.pop();
int tmp=s.empty()? vecSum(num, 0, n-1): vecSum(num, s.top()+ 1, n - 1);
int curSum = num[top]*tmp;
maxSum = max(curSum, maxSum);
}
return maxSum;
}
int enum_method(vector<int> &num) {//穷举方法,用于测试
int n = num.size();
int maxSum = INT_MIN;
vector<int> tmp;
for (int i = 0; i<n; ++i) {
for (int j = i; j<n; ++j) {
tmp.clear();
for (int k = i; k <= j; ++k) {
tmp.push_back(num[k]);
}
sort(tmp.begin(), tmp.end());
int curSum = tmp[0] * vecSum(tmp, 0, tmp.size() - 1);
maxSum = max(curSum, maxSum);
}
}
return maxSum;
}
vector<int> getRandomArray(int len) {//随机产生数组
vector<int> res;
if (len<0)
return res;
res.reserve(len);
srand((unsigned)time(NULL));
for (int i = 0; i<len; i++) {
res.push_back(rand() % 100);
}
return res;
}
void printArray(vector<int> arr) {//用于测试
for (int i = 0; i<arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
bool flag=true;
for(int i=1;i<200;i++){
vector<int> num = getRandomArray(i);
//printArray(num);
int res1=enum_method(num);
int res2=incr_stack(num);
if(res1!=res2){
flag=false;
break;
}
}
if(flag)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
}
字节跳动公司福利 1329人发布