习题题目内容-------------链接
import java.util.Map;
import java.util.Scanner;
/**
* @Author 陈平安
* @Date 2022/8/29 9:25
* @PackageName:PACKAGE_NAME
* @ClassName: Main
* @Description: TODO
* @Version 1.0
*/
public class Main {
static int days = 0;//打卡的天数
static int activity = 0;//活跃值
static int unhappy = 0;//未打卡的天数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n + 1];//设置的数组的长度要预先加一
//主要作用留作最后一天的打卡状态做对比
//因为如果不是预先留下一位,在确定连续未打卡的天数的时候,
// 容易超出数组的长度
//看57行 if (arr[i + 1] != 0) 便知
for (int i = 0; i < arr.length - 1; i++) {//这里有一个小陷阱,就是arr.length-1,因为初始化数组的时候
//就多加一位数组元素,所以要减去一
arr[i] = scanner.nextInt();
}
//获取初始元素
arr[n] = 3;//将最后一个数组元素设为1和0 之外的元素,方便截至连续天数
for (int i = 0; i < arr.length - 1; i++) {//这里减一的道理也是上文的道理
if (arr[i] == 1) {//判断是否是打卡
days++;//如果打卡,打卡天数++
if (days >= 1 && days <= 2) {
activity++;
} else if (days >= 3 && days <= 6) {
activity += 2;
} else if (days >= 7 && days <= 29) {
activity += 3;
} else if (days >= 30 && days <= 119) {
activity += 4;
} else if (days >= 120 && days <= 364) {
activity += 5;
} else if (days >= 365) {
activity += 6;
}//以上判断增加活跃值
} else {//如果未打卡
unhappy++;//未打卡的天数++
if (arr[i + 1] != 0) {//判断明天是否是未打卡的状态,如果是,就不走下面的程序,继续
//把未打卡的天数++
//如果明天打卡,就把已经记录下的未打卡的天数。套入公式Math.pow(2, unhappy - 1);
//减去打卡的天数
days -= Math.pow(2, unhappy - 1);
if (days < 0) {//这里默认规定打卡的天数是非负数,所以增加一个校验,如果
//是负数就置为0
days = 0;
}
unhappy = 0;//这个很重要,因为在减去未打卡的天数以后,前面未打卡的天数就要置空的,不然就是一直累加
}
}
}
System.out.println(activity);//最后输出活跃值
}
}
注解参看代码部分