所做过的笔试真题
目录
- 京东20250816
- 1.序列逆序对优化
- 2.滑动窗口最大最小值
- 京东20250809
- 1.子序列的字典序
京东20250816
1.序列逆序对优化
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;if (!(cin >> T)) return 0;while (T--) {int n;cin >> n;vector<int> arr(n);for (int i = 0; i < n; ++i) cin >> arr[i];vector<int> totalCount(n + 2, 0);for (int v : arr) ++totalCount[v];vector<int> seenPrefix(n + 3, 0);long long currentGain = 0;long long bestGain = 0;for (int i = 0; i < n; ++i) {bestGain = max(bestGain, currentGain);int v = arr[i];//这一步死活看不懂currentGain += (long long)totalCount[v - 1] - seenPrefix[v - 1] - seenPrefix[v + 1];++seenPrefix[v];}bestGain = max(bestGain, currentGain);cout << bestGain << "\n";}return 0;
}
2.滑动窗口最大最小值
在线做题链接
#include <iostream>
#include<vector>
#include <queue>
using namespace std;
int maxwindow(vector<int>& nums, int k){auto cmp=[](const pair<int,int>&a,const pair<int,int>&b){return a.first>b.first;};priority_queue <pair<int,int>>maxque;priority_queue <pair<int,int>,vector<pair<int,int>>,decltype(cmp)>minque;long sumwin=0;for(int i=0;i<k;i++){sumwin+=nums[i];maxque.push({nums[i],i});minque.push({nums[i],i});}int ansindex=0;long ans=(sumwin-maxque.top().first-minque.top().first)/(k-2);for(int j=k;j<nums.size();j++){sumwin=sumwin-nums[j-k]+nums[j];maxque.push({nums[j],j});minque.push({nums[j],j});while(maxque.top().second<=(j-k)){maxque.pop();}while(minque.top().second<=(j-k)){minque.pop();}long tem=(sumwin-maxque.top().first-minque.top().first)/(k-2);if(tem>ans){ans=tem;ansindex=j-k+1;}}return ansindex;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int a, b;if (!(cin >> a >> b)) return 0;vector<int> value(a);for(int i=0;i<a;i++){cin>>value[i];}cout << maxwindow(value,b) +1<< endl;return 0;}// 64 位输出请用 printf("%lld")
参考答案
京东20250809
1.子序列的字典序
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;vector <int> dicfunc(vector <int>& arr,int k){unordered_map<int,int> count;for(auto num:arr){count[num]++;}vector<int> coll;unordered_map<int,bool> flag;for(int i=0;i<arr.size();i++){count[arr[i]]--;if(flag[arr[i]])continue;while(!coll.empty()&&count[coll.back()]>0&&coll.back()>arr[i]){flag[coll.back()]=false;coll.pop_back();}coll.push_back(arr[i]);flag[arr[i]]=true;if(coll.size()==k)break;}return coll;}int main() {int n,k;cin>> n>>k;vector<int>arr(n);for(int i=0;i<n;i++){cin>>arr[i];}vector <int> ans=dicfunc(arr,k);for(int i=0;i<k;i++){cout<<ans[i];if(i!=k-1){cout<<" ";}}cout<<endl;return 0;
}
// 64 位输出请用 printf("%lld")
参考资料