返回整个集合中最小整数的算法

时间:2014-11-13 14:46:56

标签: c++

我似乎无法绕过离线最低算法。有人可以向我解释一下吗? 可能在" near-code"中使用伪代码时尚。 比如说,我有以下顺序:

"5","4","6","E","1","7","E","E","3","2"

返回整个集合中最小整数的步骤是什么。我理解这个问题,但我似乎找不到一种编码方法。

此致

4 个答案:

答案 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

DEMO


编辑:请注意,在当前表单中,它仅适用于单位数字。如果这还不够,请删除"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。但问题不在于输入验证/处理,所以我把它留作了一个功能。