【发布时间】:2021-04-13 16:37:59
【问题描述】:
我正在尝试编写这个要求用户输入字符串的程序,我的工作是打印出使字符串中不同字符的频率相等所需的最少步数。
示例
输入
6
aba
abba
abbc
abbbc
codedigger
codealittle
输出
1
0
1
2
2
3
这是我的程序:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<char, int >m;
vector<int> vec1, vec2;
string s;
int n;
cin >> n;
cin.ignore();
for (int i = 0; i < n; ++i)
{
m.clear();
vec1.clear();
getline(cin, s);
for (int i = 0; i < s.size(); i++)
m[s[i]]++;
for (auto itr : m)
vec1.push_back(itr.second);
sort(vec1.begin(), vec1.end());
int mid = vec1[vec1.size() / 2];
int ans = 0;
for (auto itr : vec1)
ans += abs(mid - itr);
vec2.push_back(ans);
}
for (int i = 0; i < vec2.size(); ++i)
cout << vec2[i] << endl;
}
我尝试做的是针对每个测试用例:
- 使用
unordered_map计算字符串中字符的频率。 - 将地图的键值推送到向量。
- 按升序对向量进行排序。
- 计算向量的中间元素,以尽可能少的步长均衡不同的字符。
- 结果将添加中间元素与当前元素之间的差异。
- 将结果推送到另一个向量并打印出来。
但我的结果在测试用例 5 处是错误的:
1
0
1
2
3 // The actual result is 2
3
我不明白为什么我得到错误的结果,谁能帮我解决这个问题?感谢您的帮助!
【问题讨论】:
-
那么,当您使用调试器逐行执行代码时,您观察到了什么?所有变量都按照您的预期发生变化吗?
-
您应该详细说明在每个步骤中允许执行哪些操作。例如,您可以添加一个新角色吗?
-
@Damien,不,您不能添加新字符,只需更改字符串的字符,使所有不同字符的频率相同。
-
我不知道为什么这个问题被关闭了。我相信我理解 OP 的问题,并且我已经为它写了一个答案,我现在无法发布。在我看来,他/她的问题不是为什么他/她的代码“不起作用”,而是为什么算法不是最优的。
-
我投票重新打开这篇文章的原因如下:代码应该做什么现在已经很清楚了。 OP 提出了一种非常接近于好的算法。我们有一个先生。我们有一个包含正确/错误答案的简单测试用例。