我似乎无法绕过离线最低算法。有人可以向我解释一下吗? 可能在" near-code"中使用伪代码时尚。 比如说,我有以下顺序:
"5","4","6","E","1","7","E","E","3","2"
返回整个集合中最小整数的步骤是什么。我理解这个问题,但我似乎找不到一种编码方法。
此致
答案 0 :(得分:1)
如果你想让人们给你他们不会的代码。 对于您给出的列表的这个特殊问题,您也可以 1)排序然后从开始开始找到最小的整数 2)只需遍历每个数字
您可以保留一个临时变量以保持当前最低值。然后单步执行并将其与此变量进行比较。如果它较低,则将该值设置为最低值。
完成单步操作后,只需返回该临时变量的值。
答案 1 :(得分:1)
您可以执行以下操作: -
1)将min变量设置为INT_MAX。
2)逐个开始提取字符串。如果它们表示整数,则将其与您存储的最小值进行比较。如果它小于将min更改为该值。如果它大于移动到下一个元素。
3)最后你将拥有min元素。
答案 2 :(得分:0)
以下是来自标准库的一些调用,它们按照您的要求执行操作。它们可能不是最有效的。
std::vector<std::string> v{"5","4","6","E","1","7","E","E","3","2"};
std::vector<std::string> r{"1","2","3","4","5","6","7","8","9"};
std::sort(v.begin(), v.end());
//remove all elements which are not numbers
std::vector<std::string> v_numbers;
std::set_intersection(v.begin(), v.end(), r.begin(), r.end()
, std::back_inserter(v_numbers));
//find minimum element
std::string result = *std::min_element(v_numbers.begin(), v_numbers.end());
std::cout<<result<<std::endl;
这会打印1
。
编辑:请注意,在当前表单中,它仅适用于单位数字。如果这还不够,请删除"E"
前面的所有set_intersection
- 如果"E"
是您的唯一字母。或者生成一个字符串向量r
,其结尾的数字大于"9"
。或者做一些完全不同的事情。
答案 3 :(得分:0)
因为我没有更好的事情要做,所以利用标准库的强大功能实现了一个示例:
#include <iostream>
#include <set>
#include <vector>
std::vector<int> offline_minima(const std::vector<int>& input)
{
std::vector<int> result;
std::multiset<int> numbers; // handles duplicate input like in 4,4,5,E,4,6,E,E
for(int i : input)
{
if(i == 'E') // We need to extract the minimum
{
if(numbers.empty())
throw -42; // shouldn't happen with valid input
result.push_back(*(std::begin(numbers))); // store the minimum number
numbers.erase(std::begin(numbers)); // remove the minimum number from our sorted numbers
}
else
numbers.insert(i); // store the new number in the sorted set numbers
}
return result;
}
int main()
{
const std::vector<int> input{ 5, 4, 6, 'E', 1, 7, 'E', 'E', 3, 2 };
const auto result = offline_minima(input);
for(int i : result)
std::cout << i << '\n';
}
Live demo here。
注意我滥用了'E'
之类的字符可以转换为int
的事实,因此如果数组包含值69
,则会将其误解为E
。但问题不在于输入验证/处理,所以我把它留作了一个功能。