前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

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,

ContactAuthor