【发布时间】:2020-02-22 20:49:03
【问题描述】:
假设我有这个整数列表:
var numbers = new List<int> { 0, 0, 0, 27, 29, 24, 35, 33, 32, 1, 1, 1, 22, 55,
44, 44, 55, 59, 0, 0, 0, 0 };
我想实现下面描述的搜索算法。我在找 59 号。
- 某些未指定的条件决定了我是从左侧还是从右侧进行迭代。在本例中,假设从左到右是迭代的方向。
- 我们需要修剪列表的开头:
- 2.1。应该忽略前导 0。
- 2.2。如果下一个项目具有相同的十位,则将它们组合在一起。例如,27、29、24 被组合在一起。接下来,将 35、33、32 组合在一起。接下来,55. 等等。
- 2.3。如果该组包含偶数,则将其忽略并继续下一个,直到找到仅包含奇数的组。该组也被忽略,我们继续执行该算法的第 3 步。
- 2.3。 1 也会被忽略。
- 一旦列表的开头被清除,我们需要处理剩余项目的结尾(
44, 44, 55, 59, 0, 0, 0, 0):- 3.1。我们正在寻找第一个包含以 9 结尾的项目的组。我们返回这个项目。 59 被退回。如果我们从另一个方向迭代,就会找到 29 个。
我将如何在 C# 中实现这个算法?以下是我的一些担忧:
- 我可以使用
while或for构造迭代整个列表,但有时我必须从列表末尾开始这一事实会导致索引代码混乱。我曾想过实现自定义IEnumerable/IEnumerator来隐藏这种混乱,但在这种情况下,我应该使用foreach语句。但是,我想当我尝试处理上面这个foreach中描述的组时,我仍然会一团糟。 - 我应该如何迭代列表并同时构建这些组。在 C# 中执行此操作的简洁方法是什么?
- 出于效率原因,我们不应该通过第一次从列表中过滤掉所有的 0。在示例中,该列表可能是一个非常长的 10000000000 个元素列表的开始。如果我们要查找的数字是第 15 个,则无需检查第 9918477 个元素。
- 此外,此算法有 2 个不同的部分(序列的开头和结尾)。我不知道我应该如何在一次迭代中处理它们。
注意:这个例子不是家庭作业。这是一个简化的问题,旨在删除涉及复杂对象和条件的实际问题的不必要细节。
【问题讨论】:
-
这是作业吗?
-
不,这是一个虚构的例子。真实的事物涉及复杂对象的列表,并且条件和分组不同。我试图从一个更复杂的问题中创建一个非常简单的例子。
标签: c# algorithm conditional-statements