多米诺骨牌(模拟)

  • 初始化数据结构

    • 使用一个布尔数组 arr 来表示每个位置是否被占用。初始时所有位置均为 false(未占用)。
    • 使用一个 LinkedHashMap(命名为 queue)来记录最近的 R 操作的位置。这个结构可以保持插入顺序,方便后续处理。
  • 遍历输入字符串

    • 遍历每个字符,根据字符的类型(.LR)进行不同的处理:
      • .:表示空位,跳过。
      • L
        • 如果 queue 为空(没有 R),将当前位置之前的所有位置标记为占用(true)。
        • 如果 queue 不为空,处理最近的 R
          • queue 中获取并移除最近的 R 的位置。
          • 计算从这个 R 到当前 L 之间的影响区域,并根据位置关系决定标记的方式。具体来说,如果 LR 之间的距离是偶数,则需要跳过中间位置;如果是奇数,则可以直接标记所有位置为占用。
      • R:将当前索引加入 queue,以备后续处理。
  • 处理剩余的 R

    • 遍历完字符串后,如果 queue 中还有 R,取出第一个 R 的位置,将这个位置及其后所有位置标记为占用。
  • 计算未占用的位置

    • 遍历 arr 数组,统计未被占用的位置,并将它们的索引(1-based)加入结果队列。
  • 构造结果字符串

    • 如果没有未占用的位置,返回 "0"
    • 否则,构造结果字符串,格式为 "count:pos1,pos2,...",并返回。
import java.util.ArrayDeque;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Iterator;public class Main {public static String solution(int num, String data) {boolean[] arr = new boolean[data.length()];LinkedHashMap<Character, Integer> queue = new LinkedHashMap<>();for (int i = 0; i < data.length(); i++) {switch (data.charAt(i)) {case '.':break;case 'L':if (queue.isEmpty()) {for (int j = 0; j <= i; j++) {arr[j] = true;}} else {Iterator<Map.Entry<Character, Integer>> iterator = queue.entrySet().iterator();Map.Entry<Character, Integer> firstEntry = iterator.next(); // 获取第一个条目iterator.remove();boolean skipTwo = false;int top = firstEntry.getValue();int extra = (i + top) / 2;if ((i - top) % 2 != 0) {skipTwo = true;}for (int j = top; j <= i; j++) {if (skipTwo) {arr[j] = true;} else {if (j != extra) {arr[j] = true;}}}}break;case 'R':queue.put('R', i);break;}}// Check if the queue is not emptyif (!queue.isEmpty()) {// Retrieve and remove the first entryIterator<Map.Entry<Character, Integer>> iterator = queue.entrySet().iterator();Map.Entry<Character, Integer> firstEntry = iterator.next();iterator.remove(); // Pop the first entryif (firstEntry.getKey() == 'R') {int topValue = firstEntry.getValue();for (int j = topValue; j < arr.length; j++) {arr[j] = true; // Set all subsequent elements to true}}}int count = 0;ArrayDeque<Integer> result = new ArrayDeque<>();for (int i = 0; i < data.length(); i++) {if (!arr[i]) {count++;result.add(i + 1); // 1-based index}}if (count == 0) {return "0"; // All positions are filled}StringBuilder resultString = new StringBuilder(count + ":");for (int pos : result) {resultString.append(pos).append(",");}resultString.setLength(resultString.length() - 1); // Remove the last commareturn resultString.toString();}public static void main(String[] args) {// // You can add more test cases hereSystem.out.println(solution(14, ".L.R...LR..L..").equals("4:3,6,13,14"));System.out.println(solution(5, "R....").equals("0"));System.out.println(solution(1, ".").equals("1:1"));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI基础】pytorch lightning 基础学习

传统pytorch工作流是首先定义模型框架&#xff0c;然后写训练和验证&#xff0c;测试循环代码。训练&#xff0c;验证&#xff0c;测试代码写起来比较繁琐。这里介绍使用pytorch lightning 部署模型&#xff0c;加速模型训练和验证&#xff0c;记录。 准备工作 1 安装pytorch…

【分布式微服务云原生】使用Docker体验不同Linux发行版

Docker 允许用户在同一个宿主机上运行多种不同的Linux发行版&#xff0c;而共享同一个宿主机内核。这种方式不仅节省资源&#xff0c;还非常方便进行环境测试和开发。 1. Docker与Linux发行版 Linux内核 发行版 Linux内核与各种发行版软件包组合&#xff0c;构成了一个完整的…

JAVA红娘婚恋相亲交友系统源码全面解析

在数字化时代&#xff0c;红娘婚恋相亲交友系统成为了连接单身男女的重要桥梁。JAVA作为一种流行的编程语言&#xff0c;为开发这样的系统提供了强大的支持。编辑h17711347205以下是对JAVA红娘婚恋相亲交友系统源码的全面解析&#xff0c;以及三段示例代码的展示。 系统概述 …

[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?

目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …

Visual Studio 2022

VS&#xff08;Visual Studio&#xff09;是一款由微软开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发应用程序、网站以及移动应用等。VS的历史可以追溯到1997年&#xff0c;当时发布了第一个版本的VS。以下是VS的一些重要历史里程碑&#xff1a; Visual …

ArcEngine C#二次开发图层处理:根据属性分割图层(Split)

需求&#xff1a;仅根据某一属性&#xff0c;分割图层&#xff0c;并以属性值命名图层名保存。 众所周知&#xff0c;ArcGIS ArcToolbox中通过Split可以实现图形分割一个图层&#xff0c;以属性值命名图层&#xff0c;如下图所示。 本功能仅依据属性值&#xff0c;将一个shp图…

MATLAB中的模型预测控制(MPC)实现详解

模型预测控制&#xff08;MPC&#xff09;是一种基于模型的优化控制策略&#xff0c;广泛应用于工业过程控制、无人驾驶、机器人等领域。MPC通过预测未来的系统行为&#xff0c;优化控制输入以达到预期的控制目标。本文将详细介绍如何在MATLAB中实现MPC&#xff0c;包括基本原理…

Socket【C#】Demo

字段&#xff1a; Socket RJ45;//以太网 属性&#xff1a; public Socket socket { get > RJ45; set > RJ45 value; } 构造&#xff1a; //实例化Socket RJ45 new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 连接&#xff1a; //封装…

后台监控中的云边下控耗时、边缘采集耗时 、云边下控量

云边下控耗时&#xff1a;指云端控制边缘设备的时间&#xff0c;从云端下发指令到边缘设备响应完成的时间。该指标反映了云端控制边缘设备的效率和响应速度。 边缘采集耗时&#xff1a;指边缘设备采集数据到云端处理完成的时间&#xff0c;包括数据采集、传输、处理等环节。该…

NETTY 是什么

Netty netty 很多都已经封装好了&#xff0c;比如客户端和服务端的连接后只要实现channelActive 方法 客户端给服务端发送send数据的时候&#xff0c;只要实现channgelRead方法 netty 就是一个nio程序&#xff0c;对nio做了很多封装&#xff0c;优化&#xff0c;用netty的时…

转行大模型的必要性与未来前景:迎接智能时代的浪潮

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;特别是大型语言模型&#xff08;LLM, Large Language Models&#xff09;的崛起&#xff0c;各行各业正迎来一场前所未有的技术革命。对于普通程序员而言&#xff0c;转行进入大模型领域不仅是对个人职业发展…

【Web】Electron:第一个桌面程序

Electron 是一个开源框架&#xff0c;使开发者能够使用 HTML、CSS 和 JavaScript 构建跨平台的桌面应用程序。通过 Electron&#xff0c;开发者可以将网页技术应用于桌面软件开发&#xff0c;从而利用现有的网页技术栈构建功能强大的桌面应用。 下载 Electron 虽然 Electron …

【第十五章:Sentosa_DSML社区版-机器学习之关联规则】

目录 15.1 频繁模式增长 15.2 PrefixSpan 【第十五章&#xff1a;Sentosa_DSML社区版-机器学习之关联规则】 机器学习关联规则是一种用于发现数据集中项之间有趣关系的方法。它基于统计和概率理论&#xff0c;通过分析大量数据来识别项之间的频繁共现模式。 15.1 频繁模式增…

Python 爬虫 根据ID获得UP视频信息

思路&#xff1a; 用selenium库对网页进行获取&#xff0c;然后用bs4进行分析&#xff0c;拿到bv号&#xff0c;标题&#xff0c;封面&#xff0c;时长&#xff0c;播放量&#xff0c;发布时间 先启动webdriver.&#xff0c;进入网页之后&#xff0c;先等几秒&#xff0c;等加…

CMake 中 add_definitions() 使用的注意事项及替代方案

CMake 中 add_definitions() 使用的注意事项及替代方案 在 CMake 中使用 add_definitions() 函数时&#xff0c;虽然其作用范围是全局的&#xff0c;但在实际应用中可能会遇到一些问题&#xff0c;导致其对子目录的影响不如预期。理解和避免这些问题可以帮助更高效地使用 CMak…

python中序列化和反序列化

在 Python 编程中&#xff0c;序列化 是指将一个 Python 对象转换为一种可以存储或传输的格式的过程。通过序列化&#xff0c;可以将对象的数据结构转化为诸如 JSON、XML、YAML 等格式&#xff0c;以便将其存储到文件、数据库&#xff0c;或者通过网络进行传输。与之对应的过程…

lvm管理磁盘过程记录

lvm管理磁盘过程记录.md 0.参考文章一、使用lvm在Linux系统上进行磁盘管理1.安装 LVM 工具2.创建物理卷&#xff08;PV&#xff09;3.创建卷组&#xff08;VG&#xff09;4.创建逻辑卷&#xff08;LV&#xff09;5.格式化逻辑卷6.挂载使用7.开机自动挂载&#xff08;可选&#…

Unity 的Event的Use()方法

对于Event的Use方法&#xff0c;其在调用后将不会再判断同类型的事件 这种情况下&#xff0c;第二个MosueDown不会进入&#xff0c;因为已经Use 如果把Use注释掉 依旧能进入第二个MosueDown 也就是说当使用了Use方法&#xff0c;相同的事件类型不会进第二遍

【反素数】

题目 思路 首先分析 的性质 一定是 中约数最大的一定是约数同是最大的数字中值中最小的进一步挖掘性质&#xff0c;紧贴枚举的做法 约数最大值最小&#xff08;也决定了层数、其它约束&#xff09;&#xff0c;是枚举的比较条件实现上述目的&#xff0c;枚举的质数种类在大小…

Tensorflow 2.0 cnn训练cifar10 准确率只有0.1 [已解决]

cifar10 准确率只有0.1 问题描述踩坑解决办法 问题描述 如果你看的是北京大学曹健老师的tensorflow2.0,你在class5的部分可能会遇见这个问题 import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout,MaxPooling2D,Fla…