关于Java Arraylist中的一些方法的代码实现和约瑟夫问题

手写的一些集合方法

package JiheChongxie;

import java.util.Arrays;

public class JiheData {
	String[] shuzu = new String[1];
	int sum = 0;
	/***
	 * 集合里的添加数据,如果数据数量大于长度则自动扩充
	 * @param str
	 */
	public void add(String str) {
		if (shuzu.length == sum) {				
			shuzu = Arrays.copyOf(shuzu, size()+1);
		}
		shuzu[sum] = str;
		sum++;
	}
	/***
	 * 集合里根据下标删除,并把后面的数据往前挪一位
	 * @param shu
	 */
	public void remove(int shu) {
		for (int i = shu; i < size()-1; i++) {
			shuzu[i] = shuzu[i+1];
		}
		sum--;
	}
	/***
	 * 集合里获取指定对象内容
	 * @param shu
	 */
	public String get(int shu) {
		return shuzu[shu];
	}
	/***
	 * 返回集合长度
	 * @return
	 */
	public int size() {
		return sum;
	}
	/***
	 * 遍历打印
	 */
	public void show() {
		for (int i = 0; i < size(); i++) {
			System.out.println(shuzu[i]);
		}
	}
	 /***
	  * 清除数据
	  */
	 public void clear() {
	  shuzu = new String[0];
	  sum = 0;
	 }
	}
	
	```
## 主函数
```java
package JiheChongxie;

public class Jihemain {
public static void main(String[] args) {
	JiheData jh = new JiheData();
	jh.add("0");
	jh.add("1");
	jh.add("2");
	jh.add("3");
	jh.add("4");
	jh.add("5");
	jh.add("6");
	jh.add("7");
	jh.add("8");
	jh.add("9");
	jh.add("10");
	jh.show();
	System.out.println(jh.get(3));
	jh.remove(1);
	jh.remove(4);
	jh.show();
}	
}

添加了0-10 ,打印了一遍,然后输出了下标为3所对应的数字,删除了下标为1和4的数(这里要注意先删除的下标为1的数字,此时“1”已经没有了,“1”后面的往前挪,那么删除的就是“5”),打印出来应该是0 2 3 4 6 7 8 9 10**

在这里插入图片描述

约瑟夫问题:

有n个人,编号为1~n,
从第一个人开始报数,从1开始报,报到m的人会死掉,
然后从第m+1个人开始,重复以上过程。
在死了n-1个人后,问最后一个人的编号是?

这类题有很多思路,这里就说两个:一个就是用集合的方法,另一个就是从数学的角度做
集合:
假设有7个人,数到3的话,那么会剩下4,我们来看一下
1 2 3 4 5 6 7
4 5 6 7 1 2
1 2 4 5 7
4 5 7 1
1 4 5
1 4
4

import java.util.ArrayList;

public class test1 {
	 public static void main(String[] args) {
	        ArrayList<Integer> hao = new ArrayList<Integer>();
	        int n = 7;
	        int m = 3;
	        int floag = 1;
	        for (int i = 1;i <= n;i++){
	            hao.add(i);
	        }
	        System.out.println(hao.toString());
	        while (hao.size() != 1) {
	        	for (int i = 0;i < hao.size();i++) {
		            if (floag == m) {
		    	        System.out.println("删除了"+hao.get(i));
		                 hao.remove(i);
		                 i--;
		                 floag = 1;
		            }else {
						floag++;  
					}
		        }
			}
	        System.out.println(hao);
	    }
	}

在这里插入图片描述
数学:逆向思维

public class 约瑟夫问题 {
    //  1   2   3   4   5   6   7
    //  4   5   6   7   1   2        (0+3)%7
    //  7   1   2   4   5            (3+3)%6
    //  4   5   7   1                (0+3)%5
    //  1   4   5                    (1+3)%4
    //  1   4                        (1+3)%3
    //  4                            (0+3)%2   上次的下标 = (这次的下标+3)%上次还有多少个
    public static void main(String[] args) {
        int n = 7;    	//总人数
        int m = 3;		//间隔数
        int s = 2;		//上次剩余的个数
        int z = 0;		//上次的下标
        for (int i = 0; i < n - 1;i++){
            System.out.println("("+z+"+"+m+")%"+s);
            z = (z+ m) % s;
            s++;
        }
        System.out.println();
        System.out.println(z+1);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值