C++程序:用大于前一个重复值替换重复值
本文介绍了一系列整数。假设我们有一个包含四个元素的数组(不计算重复元素),[2, 2, 5, 5, 7, 8, 7],我们需要使数组变得独特。我们可以将一个值更改为大于前一个值的值。
在上面的数组中,索引1处的元素2变为3,因为它是下一个更大的元素。索引3处的5变为6,依此类推。因此,最终我们的数组变为[2 3 5 6 7 8 9],并且在过程中应最大程度地减少元素的总和。
让我们来看一些输入场景 -
假设给定的输入字符串每个元素都有一个重复项,则获得的结果为 -
Input: [1, 1, 2, 2, 4, 4, 6, 6] Result: [1 2 3 4 5 6 7 8]
假设给定的输入字符串只有一个元素有多个重复项,则获得的结果为 -
Input: [1, 1, 1, 1, 1, 1] Result: [1 2 3 4 5 6]
由于新值必须大于前一个重复值,因此获得一个序列。
示例(使用向量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++) { // check whether the element in a set is repeated or not if (set.find(array[i]) == set.end()) set.insert(array[i]); else { for (int j = array[i] + 1; j < INT_MAX; j++) { // finding the next maximum element 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。
广告