拼多多-服务端开发笔试-2020.4.10
第一题
对价格从大到小进行排序,然后对下标取余,如果余数等于2,就不加上对应的值。
struct cmp {
bool operator()(const int & lhs, const int & rhs) {
return lhs > rhs;
}
};
int main() {
int N;
cin >> N;
vector<int> vec;
int temp;
for (int i = 0; i < N; ++i) {
cin >> temp;
vec.emplace_back(temp);
}
long long money = 0;
sort(vec.begin(), vec.end(), cmp());
for (int i = 0; i < N; ++i) {
if (i % 3 != 2) {
money += vec[i];
}
}
cout << money << endl;
return 0;
} 第二题
leetcode974原题。
- 先求前序和
- 然后对每个前序和取余,并用一个map存储余数出现的次数
- 对每个余数出现的次数,计算(n-1)*n/2,并累加
int main() {
int N, M;
vector<long long> vec;
cin >> N;
cin >> M;
long long temp = 0;
for (int i = 0; i < N; ++i) {
cin >> temp;
vec.emplace_back(temp);
}
int res = 0;
vector<long long> prefix(N+1,0);
for (int i = 0; i < N; ++i)
prefix[i + 1] = prefix[i] + vec[i];
vector<int> count(M,0);
for (int i = 0; i < N + 1; ++i) {
int temp = (prefix[i] % M + M) % M;
++count[temp];
}
for (int i = 0; i < M; ++i) {
res += count[i] * (count[i] - 1) / 2;
}
cout << res << endl;
return 0;
} 第三题
这题后面想到的,不知道是否正确,欢迎校正。
思路:
- 首先判断是否存在个数大于等于K的数字,如果存在直接输出
- 对0~9的每个数字进行判断
- 如果个数大于0,然后判断变成K个该数字,需要的最小开销
- 最后得到0~9中最小开销的数字
- 修改字符串,找到第一个字典序列
int main() {
int N, K;
cin >> N;
cin >> K;
vector<int> vec;
map<int, int> m;
string str;
cin >> str;
for (int i = 0; i < N; ++i) {
++m[str[i]-'0'];
}
for (int i = 0; i < 10; ++i) {
if (m[i] >= K) { //如果存在满足需求的,即存在大于K个的数,直接输出
cout << 0 << endl;
cout << str << endl;
}
}
//找出应该有K个的数,并得到消耗的能量
int val = INT_MAX;
int index = -1;
for (int i = 0; i < 10; ++i) {
if (m[i] == 0)
continue;
int left = i - 1, right = i + 1;
int nums = K - m[i];
int leftVal = 0, rightVal = 0;
int leftNums = nums, rightNums = nums;
while (nums > 0) {
if (right < 10) {
rightVal += (right - i) * (min(nums, m[right]));
nums -= m[right];
++right;
}
if (nums > 0 && left >= 0) {
leftVal += (i - left) * (min(nums, m[left]));
nums -= m[left];
--left;
}
}
if (val > leftVal + rightVal) {
val = leftVal + rightVal;
index = i;
}
}
//修改字符串,找到第一个字典序列
int left = index - 1, right = index + 1;
int nums = K - m[index];
while (nums > 0) {
if (right < 10 && m[right] > 0) {
for (int i = 0; i < N; ++i) {
if (str[i] - '0' == right) {
str[i] = '0' + index;
--nums;
}
if (nums == 0)
break;
}
++right;
}
else if(right < 9) {
++right;
}
if (nums > 0 && left >= 0 && m[left] > 0) {
for (int i = 0; i < N; ++i) {
if (str[i] - '0' == left) {
str[i] = '0' + index;
--nums;
}
if (nums == 0)
break;
}
--left;
}
else if (nums >0 && left >= 1){
--left;
}
}
cout << val << endl;
cout << str << endl;
return 0;
} #拼多多笔试##拼多多##笔试题目#
查看10道真题和解析