手写的一些集合方法
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);
}
}