不同的数字组成的圆圈中删除第m 个数字

本文深入探讨了一种在数据结构背景下解决特定问题的算法,该算法涉及在一个形成圆圈的数字集合中,按照指定间隔删除元素直至只剩下一个。通过详细解释和示例代码,本文提供了一个简洁且高效的解决方案,不仅适用于初学者理解,也为专业人士提供了一个实用的思路。
摘要由CSDN通过智能技术生成
public class A15 {

	/**
	 *n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,
     *每次从这个圆圈中删除第m 个数字
     *(第一个为当前数字本身,第二个为当前数字的下一个数字)。
     *当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。
     *求出在这个圆圈中剩下的最后一个数字。
	 * 
	 * 印象中,这个是数据结构中的一道作业题来着
	 * @param args
	 */
	public static void main(String[] args) {
		int[] array={1,2,3,4,5,6,7,8};
		CircleNode header = CircleNode.initialize(array);
		int m = 2;
		System.out.println(deleCircleM(header,m));

	}

	/**
	 * @param header
	 * @param m
	 * @return
	 */
	private static int deleCircleM(CircleNode node, int m) {
		int temp = m;
		while(node.getValue() != node.getAfter().getValue()){
			//确定删除的元素
			while(m>1){
				node = node.getAfter();
				m--;
			}
			CircleNode preNode = getPreNode(node);
			//保证环不断
			preNode.setAfter(node.getAfter());
			//当前的节点变为删除后的那个节点
			node = node.getAfter();
			//恢复m的值,再次的循环
			m = temp;
		}
		return node.getValue();
	}

	/**
	 * 得到前一个节点
	 * @return
	 */
	private static CircleNode getPreNode(CircleNode node) {
		CircleNode temp = node;
		while(temp.getAfter().getValue() != node.getValue()){
			temp = temp.getAfter();
		}
		return temp;
	}

	

}

class CircleNode{
	private int value ;
	private CircleNode after = null;
	
	public static CircleNode initialize(int[] array){
		CircleNode header = new CircleNode();
		header.setValue(array[0]);
		CircleNode temp = header;
		for(int i=1;i<array.length;i++){
			CircleNode node = new CircleNode();
			node.setValue(array[i]);
			temp.setAfter(node);
			temp = node;
		}
		//首尾相连
		temp.setAfter(header);
		return header;
	}
	
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public CircleNode getAfter() {
		return after;
	}
	public void setAfter(CircleNode after) {
		this.after = after;
	}
	
}

心平气和的写代码,是一件很快乐的事情。。。

看到一种比较简单的解法:

int f(int n, int m)  
{  
   int i, r = 0;  
   for (i = 2; i <= n; i++)  
       r = (r + m) % i;  
   return r+1;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值