当前位置: 首页 > 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/news/133879.html

相关文章:

  • 数据结构:红黑树的插入实现(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智能无人仓库管理-进销存储
  • 深度学习入门(第二天)——走进深度学习的世界 神经网络模型
  • 中级程序员——vue3+js+git面试题
  • 汽车虚拟仿真视频数据理解--CLIP模型原理
  • 【华为OD机试高分必刷题目】洗衣服(JavaPythonC++贪心算法实现)
  • 【数据结构(二)】单链表(3)
  • 三天吃透Redis面试八股文
  • ChatGPT之父被OpenAI解雇
  • 重生之我是一名程序员 35
  • map与set的封装
  • 【华为OD题库-027】代码编辑器-java
  • 设计模式-中介者模式-笔记