圆圈中最后剩下的数字(约瑟夫环)(Java)

思路:

1、利用链表,每次移动m-1次,删除元素即可

2、利用公式

代码:

package com.datastructure.link;

import java.util.LinkedList;
import java.util.List;

/**
 * 圆圈中剩下的数字
 * 
 * 题目:0, 1, … , n-1 这n个数字排成一个圈圈,
 * 从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。
 *  
 */
public class NumberLeftInCircle {

	static class Node {
		int value;
		Node next;
		public Node(int value) {
			this.value = value;
		}
		
        @Override
        public String toString() {
            if (this.next == null) {
                return String.valueOf(this.value);
            }
            return this.value + "->" + this.next.toString();
        }
	}
	
	/**
	 * 
	 * 使用环链表,每次删除第m个元素
	 * 
	 * 
	 */
	public static int lastRemaining(int n, int m) {
		if (n <= 1 || n < m ) {
			return -1;
		}
		
		List<Integer> tmp = new LinkedList<>();
		for (int i=0; i<n; i++) {
			tmp.add(i);
		}
		
		int idx = 0;
		while (tmp.size() > 1) {
			for (int i = 0; i < m-1; i++) {
				idx = (idx + 1) % tmp.size();
			}
			tmp.remove(idx);
		}
		
		return tmp.get(0);
	}
	
	/**
	 * 使用公式 
	 */
	public static int left (int n, int m) {
		if (n <= 1 || n < m ) {
			return -1;
		}
		int last = 0;
		for (int i = 2; i <= n; i++) {
			last = (last + m) % i;
		}
		return last;
	}
	
    public static void main(String args[]) {
        
        System.out.println("5 elements remove the 2 element, left: " + lastRemaining(5, 2));
        System.out.println("5 elements remove the 2 element, left: " + left(5, 2));

    }
    
}

参考:

约瑟夫环问题:https://blog.csdn.net/derrantcm/article/details/46798717

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/88619512