2022.3.2 凌晨1点半
5、有n个孩子站成一圈,从第一个孩子开始顺时针方向报数,报到3的人出列,下一个人继续从1报数,直到最后剩下一个孩子为止。问剩下第几个孩子。例如:n=5时,最后剩下的是第4个孩子。
听同学说循环队列比较好做,但我比较头铁,用集合做。而且,如果这道题我用循环队列做,那我对于集合,还是停留在一个大概的印象,死板的概念和方法,学习知识最重要的就是掌握和运用知识。
我一开始的思路是,先一个for循环扩充,然后每次都删除第3个,删到只剩1个直接break就行了。
后来我发现这个算法简直是漏洞百出。
然后我就思考,第一是删完之后缺少补位,第二是删完之后其实第二次删的不是第3个,而是从上一个删掉的开始的3个。
后来我想到集合添加的元素在后面,那就直接全删了,每3个删掉的前两个放后面。
然后我在草稿纸上推理出了一个先加3后减2的方法。
然后我比较飘,add都不知道怎么用直接去看源码,add函数一个index参数,一个element,好,我直接当add(0,list)是添加list集合的第0个数。
然后一直报错,修改,报错,然后断点调试,看参数,发现这个函数好像不是我理解的这个意思,他是在第0个位置添加了list!
然后我改成add(list.get(0)),计算完全正确
然后就是细节优化了
捕获异常是同学指出来的,我一开始只考虑到了if(n>0),执行循环,否则print输入错误。然后我同学说:如果输入一个a呢?
如果顾客非要酒吧点炒饭的话,所有的scanner好像都得这么搞。
说起来容易,这道题也只是个小题目,其实做完这个程序挺坎坷的,主要是第一次用集合解决算法问题,毕竟很多东西都没有经验。
这次做完,对集合理解的理解加深了挺大的,毕竟一开始只是停留在一个大概的印象。现在对集合的方法运用感觉悟了很多,增删改也算是比较悟了。
package 继承与多态t5;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class application {
public static void q(List list) {
while (true) {
if (list.size() == 1)
break;
else if (list.size() == 2) {
list.remove(0);
break;
}
else {
list.add(list.get(0));
list.add(list.get(1));
list.remove(0);
list.remove(0);
list.remove(0);
}
}
}
public static void main(String[] args) {
System.out.print("请输入孩子数量");
List list=new ArrayList<>();
Scanner scanner = new Scanner(System.in);
int n;
while (true){
try {n = scanner.nextInt();
if (n<0)
System.out.print("[ "+scanner.nextLine()+" ] 不是合法的数\n请重新输入:");
else
break;
} catch (Exception e) {
System.out.print("[ "+scanner.nextLine()+" ] 不是合法的数\n请重新输入:");
}
}
for(int i = 1; i <= n; i++) {
list.add(i);
}
q(list);
System.out.println(list.get(0));
}
}