3

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

例如我有一个清单:

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 成员而不使其出现在新列表中两次。

有任何想法吗?

4

5 回答 5

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]
于 2013-07-31T09:42:39.950 回答
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

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

简而言之:前向差异和后向差异,选择其中任一差异为 的元素3

于 2013-07-31T09:16:19.787 回答
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,我们将其标记为有趣。

于 2013-07-31T09:36:03.293 回答
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;
}

测试你的输入并得到你的输出

于 2013-07-31T09:03:58.583 回答
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]]
于 2013-07-31T18:15:37.943 回答