今日算法之_1_杀人算法
前言
Github:https://github.com/HealerJean
1、杀人算法
把犯人围城一圈,每次杀掉第七个,又从第八个开始杀掉第七个,直到剩下最后一个
1.1、解题思路
1、构造囚犯Prisoner对象,设置他们的编号
2、使用
list.subList()
进行截取杀人(prisoners.subList(0, 6)
前6个放到一个集合,8到后面的放到另一个集合,然后两个集合再合并,递归杀人即可 )
1.2、算法
/**
杀人算法 : 把犯人围城一圈,每次杀掉第七个,又从第八个开始杀掉第七个,直到剩下最后一个
解题思路:
1、构造囚犯Prisoner对象,设置他们的编号
2、使用 list.subList()进行截取杀人
*/
public class 杀人算法 {
@Test
public void start() {
//1、初始化所有的囚犯,并打印
List<Prisoner> prisoners = initPrisonerList(20);
printPrisonerList(prisoners);
killPrisoner(prisoners);
}
/**
* 杀人
*/
private void killPrisoner(List<Prisoner> prisoners) {
List<Prisoner> beforeKillPrisoner = prisoners.subList(0, 6);
List<Prisoner> afterKillPrisoner = prisoners.subList(7, prisoners.size());
afterKillPrisoner.addAll(beforeKillPrisoner);
printPrisonerList(afterKillPrisoner);
if (afterKillPrisoner.size() > 6 ){
killPrisoner(afterKillPrisoner);
}
}
/**
* 打印囚犯集合
*/
public void printPrisonerList(List<Prisoner> prisoners) {
prisoners.stream().forEach(p -> {
System.out.print(p.getNumber() + ",");
});
System.out.println();
}
/**
* 初始化person集合数据
*/
public List<Prisoner> initPrisonerList(Integer n) {
List persons = new ArrayList<>();
for (Integer i = 1; i <= n; i++) {
Prisoner prisoner = new Prisoner();
prisoner.setNumber(i);
persons.add(prisoner);
}
return persons;
}
@Data
@Accessors(chain = true)
public class Prisoner {
private Integer number;
}
}
1.3、测试
@Test
public void start() {
//1、初始化所有的囚犯,并打印
List<Prisoner> prisoners = initPrisonerList(20);
printPrisonerList(prisoners);
killPrisoner(prisoners);
}
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5,6,
15,16,17,18,19,20,1,2,3,4,5,6,8,9,10,11,12,13,
2,3,4,5,6,8,9,10,11,12,13,15,16,17,18,19,20,
10,11,12,13,15,16,17,18,19,20,2,3,4,5,6,8,
18,19,20,2,3,4,5,6,8,10,11,12,13,15,16,
6,8,10,11,12,13,15,16,18,19,20,2,3,4,
16,18,19,20,2,3,4,6,8,10,11,12,13,
6,8,10,11,12,13,16,18,19,20,2,3,
18,19,20,2,3,6,8,10,11,12,13,
10,11,12,13,18,19,20,2,3,6,
2,3,6,10,11,12,13,18,19,
18,19,2,3,6,10,11,12,
12,18,19,2,3,6,10,
12,18,19,2,3,6,