从数组中删除第m个元素

时间:2010-01-29 00:17:00

标签: arrays

给定一个大小为n的数组,我需要编写一个函数来删除数组中的每个第m个元素,直到数组中只存在一个元素并返回该值。 有人可以给我一些提示吗?

6 个答案:

答案 0 :(得分:2)

听起来你正试图解决Josephus Problem

  

有人站成一圈   等待被执行。之后   第一个人被处决,一定数量   人们被跳过,一个人是   执行。人们再一次   跳过,一名男子被处决。该   消除围绕圈子的进展   (越来越小了   当执行的人被删除),   直到只留下最后一个人,谁   给予自由。

     

任务是选择地点   初始圈让你活下来   (是剩下的最后一个)。

wiki文章包含一个非常简单的上述问题的递归解决方案:让n =人数,k =每次删除要跳过的人,然后:

f(1, k) = 0
f(n, k) = (f(n - 1, k) + k) % n

答案 1 :(得分:0)

天真的方式:

  • 在元素 m 处开始指针,删除它(通过删除我的意思是在那里放一个标记,因为你不想每次删除时重建一个新数组)
  • 增加指针 m 次。如果您指向已删除的元素,请将计数器减1,以便移过 m 未删除的项目。如果你离开阵列的末端,请确保移回位置0。
  • 跟踪已删除的项目数。在 n-1 之后停止。

答案 2 :(得分:0)

在python中,它实际上为每次运行重建列表而不是删除项目。可能会做得更好。

这考虑到第一个(第0个)项应该是第一个去的。

def lms(l, m, r=0):
    """Return last man standing in the lineup l where every mth man is
    executed."""
    if len(l) == 1: return l[0]
    return lms(
        [l[x] for x in range(len(l)) if (r + x) % m], # new list without exec.
        m,                                            # frequency
        (r + len(l)) % m)                             # remainder from this round

def get_lms(n, m):
    """Just a setup function, which creates a plain range list to serve to the function. 
    Any list of any items can be used."""
    l = [x for x in range(n)]
    return lms(l, m)

>>> get_lms(10, 3):
3

答案 3 :(得分:0)

我试图实现..bt似乎具有高复杂性

public static void DeleteM(int[] arr, int m)

    {
        int k = m;
        int count = 0;
        while (count<arr.Length-1)
        {
            if (m < arr.Length && arr[m]!=-1)
            {
                    arr[m] = -1; //Mark it
                    count++;//Set the marked count
                    m = m + k;
            }
            else
            {
                int i = 0;
                if (arr[i] == -1)
                {
                    while (arr[i] == -1 && i < arr.Length)
                    {
                        i++;
                    }
                }
                m = i;

            }

        }
        for(int i=0;i<arr.Length;i++)
            if (arr[i] != -1) Console.WriteLine(arr[i]);
    }

答案 4 :(得分:0)

n,k=map(int,raw_input().split())
ans=0
for i in range(1,n+1):
    ans=(ans+k)%i
print ans+1

答案 5 :(得分:0)

使用此功能,请参阅此answer

希望它有所帮助。

function removeAtNth($array, $nth)
{
    $step = $nth - 1;       //gaps between operations
    $benchmark = 0;    
    while(isset($array[1]))
    {   
        $benchmark += $step;
        $benchmark = $benchmark > count($array) -1 ? $benchmark % count($array) : $benchmark;
        unset($array[$benchmark]);
        $array = array_values($array);
        echo implode('', $array)."\n";
    }   
}

试验:

$array = [1,2, 3,4,5,6,7,8];
removeAtNth($array, 3); 

结果:

kris-roofe@krisroofe-Rev-station:~$ php test.php
1245678
124578
24578
2478
478
47
7