3个笔试题,word文件,72小时回复邮件即可,无监考。
// #include <iostream>#23届秋招笔面经##笔试##23秋招##秋招##数据库#
// #include <vector>
// #include <stack>
// int main()
// {
// std::vector<double> v = {13.5, 13.6, 13.4, 13.3, 13.5, 13.9, 13.1, 20.1, 20.2, 20.3};
// uint32_t n = v.size();
// std::vector<uint32_t> maxArrLen(n);
// std::stack<uint32_t> st;
// for (uint32_t i = 0; i < n; i++)
// {
// while (!st.empty() && v[st.top()] <= v[i])
// st.pop();
// maxArrLen[i] = st.empty() ? i + 1 : i - st.top();
// st.push(i);
// }
// for (uint32_t i = 0; i < n; i++)
// std::cout << maxArrLen[i] << " ";
// return 0;
// }
// #include <iostream>
// #include <cmath>
// int main()
// {
// unsigned long long M1, M2, m1, m2, t = 0, n;
// std::cin >> M1 >> M2;
// m1 = M1;
// m2 = M2;
// if (m2 > m1)
// {
// unsigned long long out = m2 - m1; // n(1+n)=2out
// n = (unsigned long long)(std::sqrt(1 + 8 * out) - 1) / 2;
// unsigned long long c = (1 + n) * n / 2;
// m2 = m2 - c;
// t = n + 1;
// if (c < out && m2 >= n + 1)
// {
// m2 = m2 - (n + 1);
// t++;
// }
// }
// else
// {
// unsigned long long out = m1 - m2;
// n = (unsigned long long)(std::sqrt(1 + 8 * out) - 1) / 2;
// unsigned long long c = (1 + n) * n / 2;
// m1 = m1 - c;
// t = n + 1;
// }
// // 接下来轮流地
// // 从m1上申请t、t+2、t+4...t+2n个字节, t(n+1)+(2+2n)n/2=tn+t+n(1+n)=n*n+(t+1)n+t-m1<=0
// // 从m2上申请t+1、t+3、t+5...、t+2n-1或t+2n+1个字节
// if (m1 >= t)
// {
// n = (std::sqrt((t + 1) * (t + 1) + 2 * t + 1 + 4 * m1 - 4 * t) - t - 1) / 2;
// m1 = m1 - (n * n + (t + 1) * n + t);
// m2 = m2 - (n * n + (t + 1) * n + t + n + 1 - (t + 2 * n + 1)); // Bug:m2是无符号数,不能提前多减一个数再判断是否小于0再加上多减去的数
// if (m2 >= t + 2 * n + 1)
// {
// m2 -= t + 2 * n + 1;
// t += 2 * n + 2;
// }
// else
// t += 2 * n + 1;
// }
// std::cout << "Answer: " << t << ", " << m1 << ", " << m2 << "\n";
// // 验证程序
// m1 = M1, m2 = M2, t = 0;
// while (true)
// {
// if (m1 >= t && m2 >= t)
// {
// if (m1 < m2)
// m2 -= t;
// else
// m1 -= t;
// }
// else if (m1 >= t)
// m1 -= t;
// else if (m2 >= t)
// m2 -= t;
// else
// break;
// t++;
// }
// std::cout << "GroundTruth: " << t << ", " << m1 << ", " << m2 << "\n";
// return 0;
// }
// // 1000000000000000000 99999999999999999
// // Answer: 1483239697, 646162599, 717131344
// // GroundTruth: 1483239697, 646162599, 717131344
// // 只有一些if判断、加减乘除和开根号,时间复杂度可以看成O(1),如果按二进制位数来算时间复杂度是O(log(m1+m2))。
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
inline int lowBit(int x)
{
return x & -x;
}
int main()
{
std::vector<int32_t> v = {1, 3, 2, 3, 4};
uint32_t n = v.size();
std::vector<int32_t> r(n), a = v, t = v;
// 离散化
std::sort(t.begin(), t.end());
for (int &num : a)
{
num = std::lower_bound(t.begin(), t.end(), num) - t.begin() + 1;
}
std::vector<int32_t> tree(n + 1, 0);
for (uint32_t i = 0; i < n; i++)
{
int32_t q = a[i];
q -= 1; // 不包括本身
while (q)
{
r[i] += tree[q];
q -= lowBit(q);
}
q = a[i];
while (q < tree.size())
{
tree[q] += 1;
q += lowBit(q);
}
}
for (auto &i : r)
std::cout << i << " ";
return 0;
}