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

来源:互联网 发布:二元期权模拟软件 编辑:程序博客网 时间:2024/05/01 03:24
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;  
}

原创粉丝点击