【发布时间】:2020-10-05 09:22:30
【问题描述】:
我参加了 CodeSignal 练习考试,并且能够通过 14/16 的测试用例来解决这个问题。给你一个向量作为输入(整数列表),解决方案会很长。
最初我只是简单地使用了两个 for 循环的蛮力解决方案,并将当前的 a[i] concat a[j] 添加到运行总数中。但是,我尝试通过使用 memoization 来优化它。我使用了一个 unordered_map 对来检查我是否已经计算了 (i,j) 对,如果是,则简单地返回缓存的结果。即使进行了优化,我仍然没有通过任何额外的测试用例并收到 14/16 的结果。我缺少什么见解或优化?
我发现了类似的在线问题,但他们的见解似乎不适用于这个特定问题。
问题:
给定一个正整数数组a, 你的任务是计算所有可能的 concat(a[i], a[j]) 的总和,其中 concat(a[i],a[j]) 是 a[I] 和 a [j] 分别。
例如:
a = [10,2]
sol = 1344
a[0],a[0] = 1010
a[0],a[1] = 102
a[1],a[0] = 210
a[1],a[1] = 22
sum of above = 1344
代码:
long long concat(int x, int y)
{
string str = to_string(x)+to_string(y);
return stoll(str);
}
long long calculateSum(vector<int> a)
{
unordered_map<pair<int,int>,long long, hash_pair> memo;
long long total = 0;
for(int i = 0; i < a.size(); i++)
{
for(int j = 0; j < a.size(); j++)
{
auto currPair = make_pair(a[i],a[j]);
auto got = memo.find(currPair);
//if it's a new combination
if(currPair == got.end())
{
long long res = concat(a[i],a[j]);
memo.insert(make_pair(currPair,res));
total += res;
}
//we've computed this result before
else
{
total += got->second;
}
}
}
return total;
}
【问题讨论】:
-
请在此处发布实际问题文本。大多数人不会通过链接查看您的问题是什么,如果没有这些信息,您的问题真的无法回答。
-
我没有带我的代码,因为一旦测试会话关闭,它就消失了。但是,如果需要或要求,我可以再次输入我的代码并发布。
-
另外,将文本发布为文本,而不是图像。不是每个人都能看到图片
-
会修改帖子
-
所以,您是说您编写的代码(您没有显示)通过了 16 个测试用例中的 14 个。你想知道你错过了什么,对于另外两个?而且您认为有人可以在不查看您的程序成功计算的 14 个测试用例的情况下找出答案?
标签: c++ algorithm combinatorics