Codefights RecurringTask Issue

Codefights RecurringTask Issue

本文关键字:Issue RecurringTask Codefights      更新时间:2023-10-16

我在这个问题上被困了几个小时,我想不出来。有人能给我指个正确的方向吗?

问题是:

如果你有一个需要定期完成的任务,你可以在Asana中将其设置为循环任务。一种选择是将任务安排为每k周在一周的指定日期重复一次。

能够查看任务计划的前n个日期将是有用的。给定任务计划的第一个日期,返回包含前n个日期的数组。

在此任务中,您可能需要月份长度和工作日名称,如下所示:

一月到十二月的月长:31、28、31、30、31、31、31、30、31、31、31、31、30、30、31。

闰年的二月有29天。工作日名称:"sunday"、"monday"、"tuesday"、"wednesday"、"thursday"、"friday"、"saturday"。

2015年1月1日是星期四。日期格式为dd/mm/yyyy。

对于firstDate = "01/01/2015", k = 2, daysOfTheWeek = ["Monday", "Thursday"], n = 4,输出应为

recurringTask(firstDate, k, daysOfTheWeek, n) = 
    ["01/01/2015", "05/01/2015", "15/01/2015", "19/01/2015"]

谢谢你的帮助,这里是我的代码(我认为它是一个烂摊子,我只有3天的c++)以防万一:

int dayofweek(int d, int m, int y){
    int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
    y -= m < 3;
    return ( y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
std::vector<std::string> recurringTask(std::string firstDate, int k, std::vector<std::string> daysOfTheWeek, int n) {
    std::vector<std::string> ans = {firstDate};
    bool is_leap = false;
    //date to ints for firstDate
    int d = std::stoi(firstDate.substr(0, 2));
    int m = std::stoi(firstDate.substr(3, 2));
    int y = std::stoi(firstDate.substr(6));
    //check if leap
    int add_days = 7 * k;
    if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0){
        is_leap = true;
    }
    
    for(int i = 1; i < n; i++){
        for(int j = 1; j < daysOfTheWeek.size(); j++){
            int max_d = 31;
            //month
            if(m == 2){
                if(is_leap){
                    max_d = 29;
                }else {
                    max_d = 28;
                }
            }else{
                max_d = 30;
            }
            
            if(d + add_days > max_d){
                //Go to next month
                d = d + add_days - max_d;
                m += 1;
                if(m > 12){
                    //Go to next year.
                    m = 1;
                    y += 1;
                }
                ans.push_back(std::to_string(d) + "/" + std::to_string(m) + "/" + std::to_string(y));
            }else{
                d += add_days;
                ans.push_back(std::to_string(d) + "/" + std::to_string(m) + "/" + std::to_string(y));
            }
            
        }
    }
    return ans;
}

你做对了。

首先,你的max_d逻辑是错误的。Max_d取决于月份。

vector<int> max_d{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

根据该向量查询它。还要做闰年检查。棘手的部分是给定daysOfTheWeek向量,您需要构造另一个向量,按照开始日期的顺序保存一周中的所有日子。我的意思是

首先,保证在daysOfTheWeek向量

中有一个起始日期,它是星期几

second如果daysOfTheWeek = ["Monday", "Thursday"]并且起始日期是星期四,则需要创建一个以数字形式保存相应天数的向量。

vector<string> weekDays{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

根据该向量查询它。所以逻辑是,我取daysOfTheWeek向量并创建一个保存天数数字形式的新向量,所以这个向量应该包含星期一和星期四的[1,4]。现在我重新排列这个向量,以便在保持顺序的同时将起始日放在第一位……所以它变成了[4,1]。现在我去掉前面的元素,向量就变成了[1]对于每个任务,我只需要打印开始日期,循环u刚刚创建的向量,把每个元素添加到开始日期,然后打印。

deque<int> dow;
    for (int i = 0; i < daysOfTheWeek.size(); i++){
        for (int j = 0; j < weekDays.size(); j++){
            if (daysOfTheWeek[i] == weekDays[j]){
                dow.push_back(j);
                break;
            }
        }
    }
    int startDow = dayofweek(stoi(day), stoi(month), stoi(year));
    while (dow.front() != startDow){
        dow.push_back(dow.front());
        dow.pop_front();
    }
    dow.pop_front();