zoukankan      html  css  js  c++  java
  • 一周内签到连续天数求解

    背景

       本篇文章由我个人博客主页搬运而来,写于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方法的使用以及返回值问题就好了。

    结束

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

  • 相关阅读:
    lunix查询jdk安装路径
    (四)爬虫之动态网页
    (二)爬虫之数据提取
    图及其衍生算法(Graphs and graph algorithms)
    树及其衍生算法(Trees and tree algorithms)
    数据结构之链表(Linked list)
    查找与排序算法(Searching adn Sorting)
    数据结构之双端队列(Deque)
    数据结构之队列(Queue)
    多个git账号的SSH配置
  • 原文地址:https://www.cnblogs.com/xuanhaoo/p/14334986.html
Copyright © 2011-2022 走看看