滴滴笔试
第一题:编辑距离 a了71%
估计就是“ sum += 2 * (s.length() - len);”和“sum += 2 * (origin.length() - len);”这两个地方没仔细写了,想了想,还挺麻烦。
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <string>
#include <cctype>
#include <sstream>
using namespace std;
struct Node {
string s;
int id;
int mark;
Node(string _s, int _id, int _mark): s(_s), id(_id), mark(_mark) {}
};
string origin;
vector<int> Map(128, 0);
int calc(string s) {
if(s == origin) return 0;
int sum = 0;
if(origin.length() == s.length()) {
for(int i = 0; i < s.length(); i++) {
if(s[i] == origin[i]) continue;
else {
if(Map[toascii(s[i])] == Map[toascii(origin[i])])
sum += 1;
else sum += 2;
}
}
}
else if(origin.length() > s.length()) {
vector<vector<int> > DP(s.length() + 1, vector<int>(origin.length() + 1, 0));
for(int i = 1; i <= s.length(); i++) {
for(int j = 1; j <= origin.length(); j++) {
DP[i][j] = max(DP[i-1][j], DP[i][j-1]);
if(s[i-1] == origin[j-1]) DP[i][j]++;
}
}
int len = DP[s.length()][origin.length()];
if(len == s.length()) sum += 3 * (origin.length() - len);
else if(len < s.length()) {
sum += 3 * (origin.length() - len);
sum += 2 * (s.length() - len);
}
}
else {
vector<vector<int> > DP(origin.length() + 1, vector<int>(s.length() + 1, 0));
for(int i = 1; i <= origin.length(); i++) {
for(int j = 1; j <= s.length(); j++) {
DP[i][j] = max(DP[i-1][j], DP[i][j-1]);
if(s[i-1] == origin[j-1]) DP[i][j]++;
}
}
int len = DP[origin.length()][s.length()];
if(len == origin.length()) sum += 3 * (s.length() - len);
else if(len < origin.length()) {
sum += 3 * (s.length() - origin.length());
sum += 2 * (origin.length() - len);
}
}
return sum;
}
bool cmp(const Node &a, const Node &b) {
if(a.mark != b.mark) return a.mark < b.mark;
else return a.id < b.id;
}
int main() {
vector<char> A = {'q' ,'w' ,'e' ,'r' ,'t' ,'a' ,'s' ,'d' ,'f' ,'g' ,'z' ,'x' ,'c' ,'v'};
vector<char> B = {'y', 'u', 'i', 'o', 'p', 'h', 'j', 'k', 'l', 'b', 'n', 'm'};
for(int i = 0; i < A.size(); i++) Map[toascii(A[i])] = 1;
for(int i = 0; i < B.size(); i++) Map[toascii(B[i])] = 2;
string line, token;
getline(cin, line);
stringstream ss(line);
vector<Node> v;
int i = 0;
while(getline(ss, token, ' ')) {
if(i == 0)
origin = token;
else {
v.push_back(Node(token, i, calc(token)));
}
i++;
}
sort(v.begin(), v.end(), cmp);
for(int i = 0; i < 3 && i < v.size(); i++) {
if(i != 0) cout << " ";
cout << v[i].s;
}
return 0;
}
第二题:小球排序 输出了样例和0,a了33%
凉凉,嘤嘤嘤

