一周内签到连续天数求解


背景

?  本篇文章由我个人博客主页搬运而来,写于2018年:),就由此开启博客园之旅吧!
?  上个月,在实习的公司做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方法的使用以及返回值问题就好了。

结束

?  小生阅历较少,写的东西很基础,可能方法也不是最优,仅做一个记录,望回首见证一路成长。希望各位看官不吝指教!