用于检查列表中相似性的数字关闭的算法

时间:2013-07-31 08:50:45

标签: algorithm list

我有一个列表,我需要找到并提取新列表附近的所有数字。

例如我有一个列表:

1,5,10,8,11,14,15,11,14,1,4,7,5,9

所以,如果我想要提取所有接近3的数字(只有3,间隙必须是3,所以11,14是正确的,11,13不是。)彼此靠近我怎么能设计这个没有硬 - 编码整个事情?

结果应如下所示: 8,11,14,11,14,1,4,7

这看起来并不太难,但我有点卡住了,我能想出的是一个循环,它检查循环的n + 1个成员,如果它超过n乘以3并包含n + 1个成员在一个新的列表中,但是如果有一串需要的数字,我不知道如何包括n成员而不使它在新列表中出现两次。

任何想法?

5 个答案:

答案 0 :(得分:2)

只需遍历列表,检查下一个和上一个元素,如果它与任何一个元素相差3,则保存当前元素。在Python中,那是

>>> l = [1,5,10,8,11,14,15,11,14,1,4,7,5,9]
>>> # pad with infinities to ease the final loop
>>> l = [float('-inf')] + l + [float('inf')]
>>> [x for i, x in enumerate(l[1:-1], 1)
...  if 3 in (abs(x - l[i-1]), abs(x - l[i+1]))]
[8, 11, 14, 11, 14, 1, 4, 7]

答案 1 :(得分:1)

在Matlab中

list = [1,5,10,8,11,14,15,11,14,1,4,7,5,9]

然后

list(or([diff([0 diff(list)==3]) 0],[0 diff(list)==3]))

返回

8    11    14    11    14     1     4     7

对于那些不理解的人,Matlab diff(list)会返回list中元素的第一个(向前)差异。表达式[0 diff(list)]填充了与前导0的第一个差异,以使结果与原始list的长度相同。其余的应该是显而易见的。

简而言之:提出差异和向后差异,选择差异为3的元素。

答案 2 :(得分:1)

下面的简单C ++代码:

假设ar是初始整数的数组,而标记是boolean array

for(int i=1;i<N;i++){
     if(ar[i]-ar[i-1]==3){
         mark[i]=1;
         mark[i-1]=1;
     }
}

现在打印有趣的数字,

for(int i=0;i<N;i++){
    if(mark[i]==1)cout<<ar[i]<<" ";
}

实施背后的想法是,如果数字与前一个数字的差异为3或者它与下一个数字之间的差异为3,我们将数字标记为有趣。

答案 3 :(得分:0)

这是一个循环:

public List<int> CloseByN(int n, List<int> oldL)
{
   bool first = true;
   int last = 0;
   bool isLstAdded = false;
   List<int> newL = new List<int>();
   foreach(int curr in oldL)
   {
      if(first)
      {
         first = false;
         last = curr;
         continue;
      }
      if(curr - last == n)
      {
         if(isLstAdded == false)
         {
           newL.Add(last);
           isLstAdded = true;
         }
         newL.Add(curr);
      }
      else
      {
         isLstAdded = false;
      }
      last = curr;
   }
   return newL;
}

测试您的输入并获得输出

答案 4 :(得分:0)

和Haskell版本:

f g xs = dropWhile (null . drop 1) $ foldr comb [[last xs]] (init xs) where
  comb a bbs@(b:bs) 
    | abs (a - head b) == g = (a:head bbs) : bs
    | otherwise = 
        if null (drop 1 b) then [a] : bs else [a] : bbs

输出:

*Main> f 3 [5,10,8,11,14,15,11,14,1,4,7,5,9]
[[8,11,14],[11,14],[1,4,7]]

*Main> f 5 [5,10,8,11,14,15,11,14,1,4,7,5,9]
[[5,10]]