阿里笔试3.27场(附两题代码和前三场代码链接)
前情提要:自己参加了3.23场,其他场次根据讨论区的描述写的代码,如果题目理解有误或者有其他方面的指导,请各位留言指导,我也会更新优化~
附每一场的代码:
3.20场:
3.23场:
3.25场:
附微软3.25场讨论(这个题思路上还希望有人能以一起讨论一下):
——————————————————————————————————————————————————
3.27场:
继续是从讨论区看题目,自己写代码,因此不了解具体输入输出要求和数据范围,也不保证AC,只供讨论:
第一题:给定字符串s1,s2,求从s1变为s2的最小移动次数(要求每一次只能从s1选取任意一个字符放到s1最后)
/* 参考了讨论区大佬的思路,这道题实质上是求s1中能匹配s2的最长前缀, 剩下未匹配的字符只需要按照s2的顺序依次移动即可 时间复杂度:O(n) */ #include<iostream> #include<string> using namespace std; //检查s1是否可以变为s2 bool check(string s1, string s2) { if(s1.length() != s2.length()) { return 0; } long long rec[26] = {0}; long long i; for(i = 0; i < s1.length(); i++) { rec[s1[i] - 'a']++; } for(i = 0; i < s2.length(); i++) { rec[s2[i] - 'a']--; if(rec[s2[i] - 'a'] < 0) { return 0; } } return 1; } long long minchange(string s1, string s2) { if(check(s1,s2) == 0) { return -1; } long long i, cc = 0; for(i = 0; i < s1.length(); i++) { if(s1[i] == s2[cc]) { cc++; } } return s2.length() - cc; } int main() { string sori, star; cin>>sori; cin>>star; cout<<minchange(sori, star)<<endl; return 0; }
(更新:按照题目的输入要求做了更新,方法不变)
第二题:给定N个区间(范围1~2000),每个区间包含左右范围(1<=L<=R<=2000),每次从所有区间范围内选择一个整数,求所有选出的数的最小值的期望。 #include<iostream> #include<iomanip> #include<vector> #include<math.h> using namespace std; struct prs { int l; int r; }; void range(vector<prs> &v, int &rangel, int &ranger) { int i; rangel = 2000; ranger = 2000; for(i = 0; i < v.size(); i++) { ranger = min(ranger, v[i].r); } i = 0; while(i < v.size()) { if(v[i].l > ranger) { v.erase(v.begin()+i, v.begin()+i+1); } else { rangel = min(rangel, v[i].l); i++; } } return; } vector<double> ps(vector<prs> &v, int rangel, int ranger) { vector<double> p; int i, j; double tmp = 1; vector<double> vlen; for(j = 0; j < v.size(); j++) { vlen.push_back(double(v[j].r - v[j].l + 1)); } for(i = ranger; i >= rangel; i--) { for(j = 0; j < v.size(); j++) { if(v[j].l < i) { tmp = tmp * double((v[j].r - i + 1))/vlen[j]; } } p.push_back(tmp); tmp = 1; } for(i = int(p.size()-1); i > 0; i--){ p[i] = p[i] - p[i-1]; } return p; } double calE(vector<double> &p, int rangel, int ranger) { int i; double E = 0; for(i = 0; i < p.size(); i++) { E = E + (ranger - i)*p[i]; } return E; } int main() { int N; cin>>N; prs tmp; vector<prs> v; int rangel, ranger; int i; vector<double> p; //按照实际题目的要求,更新了一下 /* for(i = 0; i < N; i++) { cin>>tmp.l>>tmp.r; v.push_back(tmp); } */ for(i = 0; i < N; i++) { cin>>tmp.l; v.push_back(tmp); } for(i = 0; i < N; i++) { cin>>v[i].r; } range(v, rangel, ranger); p = ps(v, rangel, ranger); cout.setf(ios::fixed); cout<<fixed<<setprecision(6)<<calE(p, rangel, ranger)<<endl; return 0; }