我希望有一个函数可以返回数组中不同(非重复)值的总和:如果我有display = "none"
,我希望总和为([\w ]*)(?!display:|display = ")none([\w ]*) but it found all words "none"
。
我的尝试是:
{3, 3, 1, 5}
它返回3 + 1 + 5 = 9
,我想我知道为什么,但我不知道如何改进它。我应该改变什么?
答案 0 :(得分:2)
将所有项目放入一组中,然后计算它们。
集合是仅包含每个值的一个元素的数据结构(即,它们的每个元素都是唯一的;如果您尝试多次添加相同的值,则只计算一个实例)。
您可以查看this interesting question关于以最优雅的方式执行此操作的信息。
答案 1 :(得分:1)
首先,你的循环应该是for (int i=0; i<size;i++)
。您的实际代码正在访问数组的边界。
然后,如果您不想使用STL容器和算法(但您应该),您可以按如下方式修改代码:
int sumdiff(int* t, int size){
int sum=0;
for (int i=0; i<size;i++){
// check if the value was previously added
bool should_sum = true;
for(int j=0; should_sum && j<i;j++){
if(t[i]==t[j])
should_sum = false;
}
if(should_sum)
sum=sum+t[i];
}
return sum;
}
int main()
{
int t[4]={3, 3, 1, 5};
cout << sumdiff(t, 4);
}
答案 2 :(得分:0)
答案 3 :(得分:0)
** wasthishelpful的回答正是我所说的。在我发布我的帖子后,我看到了他的帖子。
因此,您尝试使用内循环检查重复的数字。 但是,无论什么导致错误的结果,你的外部循环将循环4次。 尝试,
答案 4 :(得分:0)
将数组元素插入集合并使用std::accumulate函数:
#include <iostream>
#include <numeric>
#include <set>
int main()
{
int t[4] = { 3, 3, 1, 5 };
std::set<int> mySet(std::begin(t), std::end(t));
int mySum = std::accumulate(mySet.begin(), mySet.end(), 0);
std::cout << "The sum is: " << mySum << std::endl;
return 0;
}
答案 5 :(得分:0)
这是另一个使用std::accumulate
的解决方案,但它会在调用std::accumulate
时迭代原始元素,并构建集合并在遇到数组中的每个数字时保持运行总计:< / p>
#include <iostream>
#include <numeric>
#include <set>
int main()
{
int t[4] = { 3, 3, 1, 5 };
std::set<int> mySet;
int mySum = std::accumulate(std::begin(t), std::end(t), 0,
[&](int n, int n2){return n += mySet.insert(n2).second?n2:0;});
std::cout << "The sum is: " << mySum << std::endl;
return 0;
}
它的工作方式是std::insert()
将返回pair
tbat,确定是否插入了该项目。该对的second
是bool
,表示该项目是否已插入集合中。如果插入成功,我们只会添加总数,否则我们会添加0
。