查找序列中剩余的元素

时间:2018-09-11 22:45:34

标签: c# algorithm performance console

每个人。我要做这个小任务:

  

有两个数字序列:

     
      
  1. A [0],A [1],...,A [n]。

  2.   
  3. B [0],B [1],...,B [m]。

  4.   
     

对序列A执行以下操作:

     
      
  1. 删除索引可以被B [0]整除的项目。

  2.   
  3. 在剩余的项目中,删除那些索引可以被B [1]整除的项目。

  4.   
  5. 重复此过程直到B [m]。

  6.   
  7. 输出最终保留的项目。

  8.   
     

输入是这样的:(其中-1是两个序列A和B的定界符)

     

1 2 4 3 6 5 -1 2 -1

这是我的代码(通过注释进行解释):

List<int> result = new List<int>(); // list for sequence A
List<int> values = new List<int>(); // list for holding value to remove

var input = Console.ReadLine().Split().Select(int.Parse).ToArray();
var len = Array.IndexOf(input, -1); // getting index of the first -1 (delimiter)
result = input.ToList(); // converting input array to List
result.RemoveRange(len, input.Length - len); // and deleting everything beyond first delimiter (including it) 

for (var i = len + 1; i < input.Length - 1; i++) // for the number of elements in the sequence B
{
    for (var j = 0; j < result.Count; j++) // going through all elmnts in sequence A
    {
        if (j % input[i] == 0) // if index is divisible by B[i]
        {
            values.Add(result[j]); // adding associated value to List<int> values
        }
    }
    foreach (var value in values) // after all elements in sequence A have been looked upon, now deleting those who apply to criteria
    {
        result.Remove(value);
    }
}

但是问题是我只通过了5/11个测试用例。 25%是“错误结果”,其余25%是“超时”。我了解我的代码可能写得很差,但是我真的不明白如何改进它。

因此,如果有经验的人可以向我解释(澄清)接下来的几点,那将非常酷:

1 。我是从控制台输入解析吗?我觉得可以用一种更优雅/更有效的方式来完成。

2 。就性能而言,我获取适用于标准并随后存储它们以供日后删除的价值的逻辑是否有效?还是有其他方法可以做到?

3 。为什么这段代码没有通过所有测试用例,或者您将如何更改它们以通过所有这些用例?

1 个答案:

答案 0 :(得分:1)

由于我完全误解了问题,因此我再次写答案。因此,毫无疑问,代码中的问题是元素的删除。让我们尝试避免这种情况。让我们尝试创建一个新的数组C,在其中可以存储每次删除后应留在A数组中的所有正确数字。因此,如果索引id不能被B [i]整除,则应将A [id]添加到数组C。然后,在用B [i]值检查所有索引之后,应将数组A替换为数组C。并对B [i + 1]执行相同的操作。重复直到到达数组B的末尾。

算法:

 1. For each value in B:
       2. For each id from 1 to length(A):
                3. If id % value != 0, add A[id] to C             
       4. A = C
 5. Return A.

编辑:请确保为1.循环的每次迭代创建一个新的数组C(或在用A替换A后清除C)