这个问题其实还有另外一个名称:猴子争大王或约瑟夫环问题。
使用队列的方式简单易懂,比数组来说又少了删除元素引起的元素迁移。
如下是Python代码,使用内置的deque队列,Java的话在util中也有现成的队列:

from collections import deque

while True:
    try:
        num = int(input())
        # 生成元素并且放入队列中,队列左侧是0,右侧是最大数num-1
        q = deque(range(num))

        i = 1
        current = None
        while len(q) > 0:
            # 弹出左边的一个
            current = q.popleft()
            if i % 3 != 0:
                # 如果不是要删除的数,重新放入队列右侧
                # 如果是要删除的队列,那么没放入队列就是如同删除了
                q.append(current)
            i += 1

        print(current)
    except:
        break