背景
上个月,在实习的公司做Java后端开发,突然,在某个像往常一样 —— 上下眼皮打架的下午,前端对我说,“你这个签到天数没有返回连续签到的天数,是不是没有好好看产品的需求呀”,嗯?撒子哦,打开jira,发现需求更新了,好吧,那我就返回个天数给你吧!
思路求解
首先,是这样的。功能就是一个签到领红包的活动,只不过控制的周期是一周一个轮回,一个周期7天,即从周一到周日。看了一下网上的连续签到天数求法,嗯,可能是我方式不对,不合胃口,我来自己写一个吧!
分析
1. 签到记录数据肯定是保存在数据库里面的,我们先取出来,再做处理;
2. 一周7天的话,那就把每一天用数字来代表吧,比起时间那一长串方便一点,1.....7;
3. 连续签到的话,那说明中间不能断,断了就不连续了;
4. 需要知道当前天的标识,来进行条件处理判断,第一种:当前天还未签到;第二种:当前天已经签到;
ok~,经过一顿分析,问题演就变成了:
给定一个不包含重复数字的数组,以及一个数字,所有数字的范围属于[1,7],求给定数字或者比给定数字小1的数是否存在包含它连续区间,求区间长度(当只有一个数字时,长度为1)
example: array = {1,2,4,5,6},index = 7
out:3
example: array = {1,2,4},index = 6
out:0
效果图
图1 | 图2 |
动手
直接上代码~
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 已经签到的天数索引
int[] array = {1,2,4};
// 计算当前天索引
int currentDayIndex = 7;
int count = judgeContinueDay(array, currentDayIndex);
System.out.println(count);
}
private static int judgeContinueDay(int[] array, int currentDayIndex) {
/**
* 判断数值大小范围省略
*/
// 该周一天也没有签到
if (array.length == 0) {
return 0;
}
// 先进行排序,从小到大
Arrays.sort(array);
/**
* 注意:通过binarySearch方法查找是否存在,使用此方法前确保数组已排序
* 返回值问题:该方法是通过二分法来搜索,返回查找的指定元素的索引(存在于
* 数组中,索引0开始),如果没有查找到返回-1或者-(插入点),
* 比如,数组排序后{1,2,4,7},查询的为3,则返回-3(不存在于
* 数组中,索引将从1开始);具体细则可以查阅。
*/
// 当前天是否存在
int index1 = Arrays.binarySearch(array, currentDayIndex);
// 当前天的前一天是否存在
int index2 = Arrays.binarySearch(array, currentDayIndex - 1);
int tmpIndex;
if (index1 < 0 && index2 < 0) { // 说明至少断签1天
return 0;
} else if (index1 < 0) { // 今天还没签,从昨天开始判断
tmpIndex = index2;
} else { // 今天已签,从今天开始判断
tmpIndex = index1;
}
// 能走到这里,说明至少有连续签到1天
int count = 1;
// 从找到的索引往前查找,如果断开了则不连续,结束
for (int i = tmpIndex; i > 0; i--) {
if (array[i] - 1 == array[i - 1]) {
count++;
} else {
break;
}
}
return count;
}
}
注意一点:Arrays的binarySearch方法的使用以及返回值问题就好了。
结束
小生阅历较少,写的东西很基础,可能方法也不是最优,仅做一个记录,望回首见证一路成长。希望各位看官不吝指教!