4.12字节跳动笔试
春招到现在做过最简单的笔试,A了3道,第二题不会,求大佬解答第二题怎么做。下面贴下1、2、4题的代码:
1. 双指针找出左右边界,然后比较区间中每个位置的差值是否相等
#include<iostream> #include<vector> using namespace std; bool solve(vector<int>& a, vector<int>& b){ int left = 0; int right = a.size()-1; while(left<a.size()){ if(a[left] == b[left]) left++; else break; } while(right>=0){ if(a[right] == b[right]) right--; else break; } while(left<right){ if((a[left]-b[left])!=(a[right]-b[right])) return false; left++; right--; } return true; } int main(){ int t; cin>>t; while(t--){ int n; cin>>n; vector<int> a(n,0); vector<int> b(n,0); for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) cin>>b[i]; if(solve(a, b)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
2. 一道简单的二分搜索题目,对优惠券数组的排序用计数排序,复杂度O(n),如果用标准库快排只能AC 90%
#include<iostream> #include<vector> #include<algorithm> using namespace std; int binarysearch(int target, vector<int>& arr){ int left = 0; int right = arr.size()-1; while(left<right){ int mid = (left + right)/2 + 1; if(arr[mid] > target) right = mid - 1; else left = mid; } return arr[left]<=target? arr[left]:0; } long long solve(vector<int>& tickets, vector<int>& products){ vector<int> count(1000001, 0); vector<int> order_tickets(tickets.size(),0); for(auto t:tickets){ count[t]++; } int index = 0; for(int i=0;i<count.size();i++){ for(int j=0;j<count[i];j++){ order_tickets[index++] = i; } } long long min_cost = 0; for(auto val: products){ int cost_cut = binarysearch(val, order_tickets); min_cost += (val-cost_cut); } return min_cost; } int main(){ int n, m; cin>>n>>m; vector<int> tickets(n, 0); vector<int> products(m, 0); for(int i=0;i<n;i++) cin>>tickets[i]; for(int i=0;i<m;i++) cin>>products[i]; cout<<solve(tickets, products)<<endl; };
4. 单调栈,调了很久才AC,写的有点凌乱
#include<iostream> #include<vector> #include<stack> using namespace std; void solve(vector<int>& heights){ vector<int> res(heights.size(), 0); vector<int> st; for(int i=0;i<heights.size();i++){ if(st.size()==0 || heights[st.back()]>=heights[i]){ st.push_back(i); } else{ while(st.size()!=0 && heights[i]>heights[st.back()]){ int top = st.back(); st.pop_back(); int left=-1; vector<int> tmp; while(st.size()!=0){ if(heights[st.back()]>heights[top]){ left = st.back(); break; } else{ tmp.push_back(st.back()); st.pop_back(); } } res[top] = i-left-2; for(auto i:tmp) res[i] = res[top]; } st.push_back(i); } } while(st.size()!=0){ int top = st.back(); st.pop_back(); int left=-1; vector<int> tmp; while(st.size()!=0){ if(heights[st.back()]>heights[top]){ left = st.back(); break; } else{ tmp.push_back(st.back()); st.pop_back(); } } res[top] = heights.size()-left-2; for(auto i:tmp) res[i] = res[top]; } for(int i=0;i<res.size();i++){ if(i==0) cout<<res[i]; else cout<<" "<<res[i]; } cout<<endl; } int main(){ int t; cin>>t; while(t--){ int n; cin>>n; vector<int> heights(n, 0); for(int i=0;i<n;i++) cin>>heights[i]; solve(heights); } }