给定一个大小为n的数组,我需要编写一个函数来删除数组中的每个第m个元素,直到数组中只存在一个元素并返回该值。 有人可以给我一些提示吗?
答案 0 :(得分:2)
听起来你正试图解决Josephus Problem:
有人站成一圈 等待被执行。之后 第一个人被处决,一定数量 人们被跳过,一个人是 执行。人们再一次 跳过,一名男子被处决。该 消除围绕圈子的进展 (越来越小了 当执行的人被删除), 直到只留下最后一个人,谁 给予自由。
任务是选择地点 初始圈让你活下来 (是剩下的最后一个)。
wiki文章包含一个非常简单的上述问题的递归解决方案:让n =人数,k =每次删除要跳过的人,然后:
f(1, k) = 0
f(n, k) = (f(n - 1, k) + k) % n
答案 1 :(得分:0)
天真的方式:
答案 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