当前位置: 首页 > article >正文

被锁总时间

 题目描述:

对一个事务进行加锁与解锁,其中有加锁数组,解锁数组,这两个数组长度相等,且数组内数据代表加锁与解锁的具体时间点,求给出数组中事务的总被锁时间。(其中加锁后默认在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;
}


http://www.kler.cn/a/133879.html

相关文章:

  • Android OpenGL ES详解——立方体贴图
  • 【Vue】Vue3.0(十九)Vue 3.0 中一种组件间通信方式-自定义事件
  • 【pytorch】常用强化学习算法实现(持续更新)
  • 【go从零单排】Timer、Epoch 时间函数
  • SpringBoot(八)使用AES库对字符串进行加密解密
  • power bi中的related函数解析
  • 数据结构:红黑树的插入实现(C++)
  • 坐标系下的运动旋量转换
  • SingleTreePolicyInterpreter
  • k8s pod 处于Terminating的原因分析和解决处理——筑梦之路
  • 【Go入门】 Go的http包详解
  • QtC++与QUndoView详解
  • lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7
  • P1304 哥德巴赫猜想
  • Fork/Join框架说明
  • OpenAI Assistants-API简明教程
  • 【人工智能Ⅰ】7-KNN 决策树
  • C复习-输入输出函数+流
  • MyBatis整合Spring Boot扫描Mapper相关配置
  • 在Ubuntu上用sane api实现通用扫描功能
  • Python OpenCV调整图像亮度对比度及RGB色彩
  • C++ ,VCPKG那些事
  • Linux终端与交互式Bash
  • 【数据分享】2023年我国省市县三级的独角兽企业数量(Excel/Shp格式)
  • 23111709[含文档+PPT+源码等]计算机毕业设计基于Spring Boot智能无人仓库管理-进销存储
  • 深度学习入门(第二天)——走进深度学习的世界 神经网络模型