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 ++ - 查找唯一元素的总和[重复]的主要内容,如果未能解决你的问题,请参考以下文章

最小唯一数组总和

c_cpp 非重复元素的总和

在PHP中查找数组元素的所有可能的唯一组合[重复]

如何查找列表中所有唯一元素的所有索引[重复]

查找数组中重复的唯一元素+时间复杂度O(n)+空间复杂度O

查找数组总和中的哪些数字到目标总和 [重复]