今日任务:
-
1026 程序运行时间
-
1027 打印沙漏
-
有N个程序猿(编号1~n)围成一圈顺序循环报数,
从第一个猿开始报数(从1到4报数,猿都是顺序排列成一圈的),凡报到4的猿退出圈子,以下一个为1继续报数,问最后留下的是原来第几号的那位。
题目的意思大致是这样,比如最开始有五个人编号为1 2 3 4 5
第一轮去掉4
1 2 3 5
第二轮起点是5,去掉3
1 2 5
第三轮起点是5,去掉5
1 2
第四轮起点是1,去掉2
1 -
跳台阶 现在有长度为n的台阶,你每次只能跳一阶或者二阶 求跳到n阶一共有多少种跳法。
小结:
1.做1026的时候对四舍五入不知道怎么解决,看了别人的解答是用打点差加50解决四舍五入。
2.做1027时我的思路是先判断给的数是偶数还是奇数,然后根据偶数的一半或奇数减一的一半得出第一行的字符数,用for循环输出空格和给出的符号但是还是有一些逻辑问题,后来转换了下思路先得出一个沙漏最多可装入的字符数的规律,然后根据此规律得出第一行最大符号数量,然后用循环先输出空格在输出符号。
3.今天的主要任务就是写第三题的约瑟夫环,一开始想着这种比较多的删除操作用链表最合适因为昨天写了单双链表,就写了个简单的单链表,但是在要索引的下一个位置需要从头开始遍历遇到困难,而且直接从底层实现单链表代码比较多,所以后面改用LinkedList类来写,省去了很多代码,首先添加就使用循环用link.add()添加,然后找到要删的数的位置,其中索引位置用i=(i+3)%link.size();其中i的初始值为0,i+3是因为报数到四的退出,link.remove(i)删除的的数据对应第四个,删除后i自动移动了一位所以一直保持i+3就可以了,最后用.peek()方法得到最后剩余的一个数据。
相关代码:
package Li;
import java.util.LinkedList;
public class Li {
public static void tC(int num){
LinkedList<Integer> link=new LinkedList<>();
for (int i = 1; i <=num; i++)link.add(i);
int i=0;
while (num>1){
i=(i+3)%link.size();
link.remove(i);
num--;
for(int m=0;m<link.size();m++){
System.out.print(link.get(m)+" ");
}
System.out.println();
}
System.out.println("最终剩下:"+link.peek());
}
}
4.第四题被如何计算上台阶方法数量给难住了,看了斐波那契数列的递归算法也没发现其中的相似之处,最后被人指点才找出规律,
用递归调用,计算方法与斐波那契相同。前一个台阶的上台阶方法等于前一个台阶上去方法加上上个台阶的上去方法。