有一个数组a[1000]存放0–1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
以8个数为例:
{0,1,2,3,4,5,6,7} 0–>1–>2(删除)–>3–>4–>5(删除)–>6–>7–>0(删除),如此循环直到最后一个数被删除。
这个在百度文库中查了下被称为约瑟夫环问题:
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解。
先来说下我的思路:
对数组进行循环遍历,设置一个删除用的计数器,计数器从0开始累加,在循环遍历的同时累加到2的时候,进行数组元素的删除操作(直接将数组元素的值赋为-1),同时还要考虑数组下标到末尾时进行移动问题(此时还要考虑判断计数器是否已经到2,也就是需要进行删除元素操作了?)、已经被删除过的元素不再遍历问题(赋值为-1的元素不再遍历,防止计数器计数出现偏差)等。
自己动手试了下,代码如下: