C++ 程序用大于前一个重复值替换重复值

c++programmingserver side programming

本文给出了一系列整数。假设我们有一个包含四个元素的数组(不计算重复元素),[2, 2, 5, 5, 7, 8, 7],我们必须使数组与众不同。将一个值更改为大于前一个值是可能的。

在上面的数组中,索引 1 处的元素 2 变为 3,成为下一个更大的元素。索引 3 处的 5 变为 6,成为下一个更大的元素,依此类推。因此,最终,我们的数组变为 [2 3 5 6 7 8 9],并且应在此过程中最小化元素的总和。

让我们看一些输入场景 -

假设给定的输入字符串对于每个元素都有重复项,则获得的结果将是 -

输入:[1, 1, 2, 2, 4, 4, 6, 6]
结果:[1 2 3 4 5 6 7 8]

假设给定的输入字符串只有一个元素有多个重复项,则获得的结果将是 -

输入:[1, 1, 1, 1, 1, 1]
结果:[1 2 3 4 5 6]

由于新值必须是,因此获得一个序列大于前一个重复值。

示例(使用 Vector ADT)

以下是一个 C++ 程序,它用大于前一个重复值的值替换数组中的重复元素 −

#include <iostream> #include <vector> #include <set> using namespace std; void solve(vector<int>& arr) { set<int> s; for(int &val : arr) { if(s.find(val) != s.end()) { for(int j=val+1;j<INT32_MAX;j++) { if(s.find(j) == s.end()) { val = j; break; } } } s.insert(val); } } void print(vector<int>& arr) { for(int val : arr) cout << val << " "; cout << "\n"; } int main() { vector<int> arr = { 5,2,5,7,8,8,7 }; print(arr); solve(arr); print(arr); return 0; }

输出

5 2 5 7 8 8 7
5 2 6 7 8 9 10

示例(不使用向量 ADT)

以下是一个 C++ 程序,它使用比先前重复值更大的值替换数组中的重复元素,而无需使用向量抽象数据类型 -

#include <bits/stdc++.h>
using namespace std;

int main()
{
   int array[] = { 1, 7, 2, 3, 4, 4, 5, 6, 6 };
   int n = sizeof(array) / sizeof(array[0]);
   for (int i = 0; i < n; i++)
      cout << array[i] << " ";
   cout << "\n";
   unordered_set<int> set;

   for (int i = 0; i < n; i++) {

      // 检查集合中的元素是否重复
      if (set.find(array[i]) == set.end())
         set.insert(array[i]);

      else {
         for (int j = array[i] + 1; j < INT_MAX; j++) { // 寻找下一个最大元素
            if (set.find(j) == set.end()) {
               array[i] = j;
               set.insert(j);
               break;
            }
         }
      }
   }
   for (int i = 0; i < n; i++)
      cout << array[i] << " ";
   cout << "\n";
}

输出

1 7 2 3 4 4 5 6 6 
1 7 2 3 4 5 6 8 9 

结论

使用 1 个 for 循环对数组进行迭代,我们将元素保存在集合中。然后使用另一个 for 循环,找到可以替换它的下一个最大值。我们在这里将集合用作哈希映射。我们也可以在这里使用 unordered_map 或 map。


相关文章