完整的问题在这里https://www.interviewbit.com/problems/random-attendance/。如果不允许我在这里提出这些问题,请告诉我。 我认为我的解决方案是正确的,对于所提供的示例,我得到了预期的结果,但是内存超出了错误。
bool compare (string a, string b){
return lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
}
vector<int> Solution::solve(int A, vector<int> &B) {
vector <string> x;
for(int i=0; i<A; i++){
x.push_back(to_string(i+1));
}
sort(x.begin(), x.end(), compare);
vector <int> ans;
for(int i=0; i<B.size(); i++){
ans.push_back(stoi(x[B[i]-1]));
}
return ans;
}
答案 0 :(得分:2)
我只是编写将B [i]转换为给定A的正确值的函数,可能使用从A派生的其他预处理数据来加快/简化计算。预处理的数据应为大约(log_10 A)整数,即最多10或20个整数。不一定不是A。
您提出的解决方案在A很大时会失败,但是对于任何A都可以编写以O(B)运行的代码(只要A是int或long long,实际速度可能应该是O(B log log A)代表任意大的A)。
作为提示,我将举一个例子。假设A = 392,908。
我们有一些B [0],我们想确定它的索引。
第一位数字是多少?是1还是2?可能是3或4?怎么知道。
实际上,恰好有111,111个索引从1开始,与2相同,而有11,111个索引从4开始(与5,6,7,8,9相同)。
虽然剩余金额(A-2 * 111,111 + 6 * 11,111)用于数字3。使用此信息,不难确定索引B [0]中的第一位。
可以通过类似的步骤确定休息。