C ++ - 查找唯一元素的总和[重复]
Posted
技术标签:
【中文标题】C ++ - 查找唯一元素的总和[重复]【英文标题】:C++ - Find sum of unique elements [duplicate] 【发布时间】:2021-02-13 06:54:47 【问题描述】:我正在尝试获取唯一元素的总和,但是我不满足给定输出的要求。
//Prompted Input: [1,2,3,2]
//Expected output: 4
//Explanation: The unique elements are [1,3]
以下是我的相关代码。我尝试过的一些事情是将 j 设置为 i 用于嵌套循环,但这并没有改变。我采取的下一步是取出第一个 if 条件并让代码在找到唯一数字后进行求和,但输出为 10。如果有人能给我一个方向,我将不胜感激因为我知道我很接近。
int sumOfUnique(vector<int>& nums)
int sum = 0;
for(int i = 0; i < nums.size(); i++)
for(int j = 0; j < nums.size(); j++)
if(j == i)
sum += nums[i];
if(nums[i] == nums[j])
break;
return sum;
【问题讨论】:
先尝试对数组进行排序(这样所有多次出现的元素都是连续的),然后循环遍历一次,将不相邻的元素(之前或之后)相加等于自身的元素。权衡是需要存储nums
的副本,这可以通过简单的值传递来实现。
这能回答你的问题吗? How to remove all instances of a duplicate from a vector<int>。他们还试图在std::vector
中积累独特的元素。
【参考方案1】:
您已经接近,因为您有嵌套循环,但循环的内容不正确。关键是您需要识别唯一元素,这不是您当前代码所做的事情。
使用内部循环来确定一个元素是否唯一,然后在内部循环之后将其添加到总和中。像这样
int sumOfUnique(vector<int>& nums)
int sum = 0;
for (int i = 0; i < nums.size(); i++)
// count how many times nums[i] occurs
int count = 0;
for (int j = 0; j < nums.size(); j++)
if (nums[i] == nums[j])
++count;
if (count == 1) // is nums[i] unique?
sum += nums[i]; // add it to the sum if it is
return sum;
诀窍是额外的变量count
来计算特定数字是否唯一。
通过将唯一性测试放入它自己的函数中,您可以使这段代码更清晰、更灵活。像这样
bool isUnique(vector<int>& nums, int i)
// count how many times nums[i] occurs
int count = 0;
for (int j = 0; j < nums.size(); j++)
if (nums[i] == nums[j])
++count;
// return true if it occurs once only
return count == 1;
int sumOfUnique(vector<int>& nums)
int sum = 0;
for (int i = 0; i < nums.size(); i++)
if (isUnique(nums, i)) // is nums[i] unique?
sum += nums[i]; // add it to the sum if it is
return sum;
最好将代码拆分为不同的函数,每个函数解决一个难题。现在(例如)您可以用不同的函数替换 isUnique
,并根据一些不同的标准对向量中的值求和。
使用std::set
有更有效的解决方案,但我希望本练习的重点是让您练习循环和算法。
【讨论】:
谢谢!所有这些都有很大帮助,是的,这是为了练习循环和算法。【参考方案2】:您可以使用std::map
创建频率计数器。之后,遍历地图并检查一个数字是否只出现过一次。如果是这样,则将该数字添加到结果中,然后打印出最终结果。
int uniqueSum(vector<int> numbers)
map<int, int> frequency;
for (auto it = numbers.begin(); it!=numbers.end(); it++)
int value = (*it);
if (frequency.find(value) == frequency.end()) frequency[value] = 1;
else frequency[value]++;
//if value already occur in map then add 1 to its counter,
//else set its counter to 1
int sum = 0;
for (auto it = frequency.begin(); it!=frequency.end(); it++)
if (it->second == 1) sum += it->first;
//if the element appear just once in the vector, add it to sum, else skip it
return sum;
您可以在此处阅读有关地图的更多信息:https://www.cplusplus.com/reference/map/map/
还有 find() 函数:https://www.cplusplus.com/reference/map/map/find/
【讨论】:
【参考方案3】:使用map
存储您看到的数字,如果它们重复,则标记为不可行。
int sumOfUnique(std::vector<int>& nums)
std::map<int, bool> seen;
for (auto i : nums)
auto it = seen.find(i);
if (it != seen.end()) // If already exists, set viability to false
it->second = false;
else seen.insert( i, true ); // Does not exist, is currently viable
int sum = 0;
for (auto pair : seen)
if (pair.second) // If viable
sum += pair.first;
【讨论】:
这不会产生所需的输出。请注意,对于给定的输入1, 2, 3, 2
,输出应该是1 + 3 = 4
,而不是1 + 2 + 3 = 6
。
@NathanPierson 我刚刚意识到,会修复它。以上是关于C ++ - 查找唯一元素的总和[重复]的主要内容,如果未能解决你的问题,请参考以下文章