携程算法方向(专业笔试一)编程题 100% 100% 87%
1.字符串分段
#include<vector>
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
cin >> str;
vector<int> res;
vector<int> v(26, 0);
for (int i = 0;i < str.length();i++)
{
int t = str[i] - 'a';
v[t] = i;
}
for (int i = 0;i < str.length();i++)
{
int t = v[str[i]-'a'];
int tmp = 0;
for (int j = i + 1;j <= t;j++)
{
if (v[str[j] - 'a'] >= t) t = v[str[j] - 'a'];
}
res.push_back(t - i + 1);
i = t;
}
for (int i = 0;i < res.size();i++)
{
cout << res[i];
if (i != res.size() - 1) cout << ",";
}
cout << endl;
return 0;
} 2.计算AUC
#include<vector>
#include<iostream>
#include<map>
#include<functional>
#include<iomanip>
using namespace std;
int main()
{
int n;
cin >> n;
map<float, int> mp;
int tp = 0, fp = 0, fn = 0, tn = 0;
for (int i = 0;i < n;i++)
{
int a;
float b;
cin >> a >> b;
mp.insert(make_pair(b, a));
if (a == 1) fn++;
else tn++;
}
float tpr = 0, fpr = 0, res = 0;
for (map<float,int>::iterator it=mp.end();it!=mp.begin();)
{
it--;
float t1 = tpr, t2 = fpr;
if (it->second == 1)
{
tp++;
fn--;
}
else {
fp++;
tn--;
}
tpr = (float)tp / (tp + fn);
fpr = (float)fp / (fp + tn);
res += (tpr + t1)*(fpr - t2) / 2;
}
res += (1 + tpr)*(1 - fpr) / 2;
cout << setiosflags(ios::fixed) << setprecision(2) << res<< endl;
return 0;
} 3.遍历所有点的最短时间(dfs,剩余13%应为超时部分)
#include<iostream>
#include<vector>
using namespace std;
int res = -1;
bool find(vector<int>& cur, int j)
{
for (int i = 0;i < cur.size();i++)
if (cur[i] == j) return true;
return false;
}
void helper(vector<int>& cur, vector<vector<int>>& dp, int i,int n,int sum)
{
if ((int)cur.size() == n&&i == n - 1)
{
if (res < 0 || sum < res) res=sum;
}
else if (i == n - 1) return;
else
{
for (int j = 0;j < n;j++)
{
if (dp[i][j] != -1 && !find(cur,j))
{
cur.push_back(j);
helper(cur, dp, j, n, sum + dp[i][j]);
cur.pop_back();
}
}
}
}
int main()
{
int n;
cin >> n;
int m;
cin >> m;
vector<vector<int>> dp(n+1, vector<int>(n+1,-1));
for (int i = 0;i < m;i++)
{
int a, b, t;
cin >> a >> b >> t;
dp[a][b] = dp[b][a] = t;
}
for (int i = 0;i <= n;i++)
{
dp[n][i] = dp[i][n] = dp[0][i];
}
vector<int> cur{ 0 };
helper(cur,dp,0,n+1,0);
cout << res << endl;
return 0;
}
查看27道真题和解析
