被锁总时间
题目描述:
对一个事务进行加锁与解锁,其中有加锁数组,解锁数组,这两个数组长度相等,且数组内数据代表加锁与解锁的具体时间点,求给出数组中事务的总被锁时间。(其中加锁后默认在60秒后解锁;已加锁的情况下再加锁则解锁时间为新时间向后60秒处;未加锁情况下解锁依然是未加锁状态)
例:
加锁数组【1,30,32,100】,解锁数组【10,50,53,80】
答案:89
提示:9+20+60
思路:(我将加锁数组定义为larr,解锁数组定义为uarr)
读完题目后我们大体思路为需要两个数组进行一一对比计算并求和得到总被锁时间;
我们清楚两个数组遍历时不会是同时向后走,因此会出现下面4种情况:
1.larr和uarr都走完了
2.larr走完了,uarr没走完
3.larr没走完,uarr走完了
4.larr和uarr都没走完
因此对应的方法:
1.代表全部比较完成,我们采用递归来实现因此返回0即可。
2.larr走完,uarr没走完代表解锁时间在最后加锁时间之后,此时只需要返回0即可。
3.larr没走完,uarr走完了代表此次加锁时间在最后一次解锁时间之后,由于题目条件已加锁的情况下再加锁则解锁时间为新时间向后60秒处,因此我们需要将剩余加锁时间两两之间进行判断,之间相差60秒以上则为60,60秒以下则为相减之数,最后相加并再加60即为结果。
4.larr和uarr都没有走完则需要一一去对比判断,此时出现三种情况:
4.1 larr[i] < uarr[j]
4.2 larr[i] > uarr[j]
4.3 larr[i] > uarr[j]
解法:
#include<iostream>
using namespace std;
int gnum(int* lockarr, int* unlockarr, const int n, int i, int j)
{
if (i == n && j != n)
{
return 0;
}
else if (i != n && j == n)
{
int num = 0;
while (i != n)
{
if (i < n - 1)
{
if (lockarr[i + 1] - lockarr[i] >= 60)
{
num += 60;
}
else
{
num += lockarr[i + 1] - lockarr[i];
}
}
i++;
}
return num + 60 + gnum(lockarr, unlockarr, n, i, j);
}
else if (i != n && j != n)
{
if (lockarr[i] < unlockarr[j])
{
int num = unlockarr[j] - lockarr[i];
if (n >= 60)
{
num = 60;
}
while (lockarr[i] < unlockarr[j])
{
i++;
if (i == n)
{
return num + gnum(lockarr, unlockarr, n, i, j);
}
}
return num + gnum(lockarr, unlockarr, n, i, j);
}
else if (lockarr[i] > unlockarr[j])
{
while (lockarr[i] > unlockarr[j])
{
j++;
if (j == n)
{
return gnum(lockarr, unlockarr, n, i, j);
}
}
return gnum(lockarr, unlockarr, n, i, j);
}
else if (lockarr[i] == unlockarr[j])
{
return gnum(lockarr, unlockarr, n, i + 1, j + 1);
}
}
else if (i == n && j == n)
{
return 0;
}
}
int getnum(int* lockarr, int* unlockarr, const int n)
{
return gnum(lockarr, unlockarr, n, 0, 0);
}
int main()
{
int larr[] = { 1,30,32,100 };
int uarr[] = { 10,50,53,80 };
cout << getnum(larr, uarr, 4) << endl;
return 0;
}