当前位置: 首页 > 面试经验 >

9/15 度小满 前端笔试

优质
小牛编辑
90浏览
2023-03-28

9/15 度小满 前端笔试

二(A了)

思路

差分数组

代码

#include<iostream>
#include <vector>

using namespace std;
const int MAX = 100000;

int main() {
int n, h, l, r, cnt = 0, end = 0;
cin >> n >> h;
vector<int> df(MAX, 0);
for (int i = 1; i <= n; ++i) {
cin >> l >> r;
df[l]++;
df[r]--;
end = max(end, r);
}
for (int i = 1; i < end; ++i) {
df[i] += df[i - 1];
cnt += df[i] >= h;
}
cout << cnt;
return 0;
}

三(没来得及提交,不知道思路对不对)

思路

计算每个周期子串0~p位置上26个字母出现的次数。依题意可知周期子串也是回文串,所以再用双指针l、r从计数数组两端往中心走,确保每次选择使得所有周期子串在位置l和r上的改动次数最少

代码

#include<iostream>
#include <vector>

using namespace std;

int main() {
int t, n, p;
string str;
cin >> t;
while (t--) {
cin >> n >> p;
cin >> str;
int ans = 0;
vector<vector<int>> cnt(p, vector<int>(26, 0));
for (int i = 0; i < p; ++i) {
for (int j = 0; j < n / p; ++j) {
cnt[i][str[j * p + i] - 'a']++;
}
}
int l = 0, r = p - 1;
while (l <= r) {
int ml = 0, mr = 0;
int cl, cr; // 从中选出要保留的字母
for (int i = 0; i < 26; ++i) {
if (cnt[l][i] > ml) {
ml = cnt[l][i];
cl = i;
}
if (cnt[r][i] > mr) {
mr = cnt[r][i];
cr = i;
}
}
int nl = 0, nr = 0; // 需要改动的次数
for (int i = 0; i < 26; ++i) {
if (i != cl) {
if (l == r)nl += cnt[l][i];
else nl += cnt[l][i] + cnt[r][i];
}
if (i != cr) {
if (l == r)nr += cnt[l][i];
else
nr += cnt[l][i] + cnt[r][i];
}
}
ans += min(nl, nr);
++l, --r;
}
cout << ans << endl;
}
}
#度小满笔试##度小满#
 类似资料: