-
初始化数据结构:
- 使用一个布尔数组
arr来表示每个位置是否被占用。初始时所有位置均为false(未占用)。 - 使用一个
LinkedHashMap(命名为queue)来记录最近的R操作的位置。这个结构可以保持插入顺序,方便后续处理。
- 使用一个布尔数组
-
遍历输入字符串:
- 遍历每个字符,根据字符的类型(
.、L、R)进行不同的处理:.:表示空位,跳过。L:- 如果
queue为空(没有R),将当前位置之前的所有位置标记为占用(true)。 - 如果
queue不为空,处理最近的R:- 从
queue中获取并移除最近的R的位置。 - 计算从这个
R到当前L之间的影响区域,并根据位置关系决定标记的方式。具体来说,如果L和R之间的距离是偶数,则需要跳过中间位置;如果是奇数,则可以直接标记所有位置为占用。
- 从
- 如果
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 empty if (!queue.isEmpty()) { // Retrieve and remove the first entry Iterator<Map.Entry<Character, Integer>> iterator = queue.entrySet().iterator(); Map.Entry<Character, Integer> firstEntry = iterator.next(); iterator.remove(); // Pop the first entry if (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 comma return resultString.toString(); } public static void main(String[] args) { // // You can add more test cases here System.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")); }}
-
多米诺骨牌(模拟)
%d%d22024-09-27 5:08
相关推荐
sheeta199817 小时前
LeetCode 每日一题笔记 日期:2025.11.24 题目:1018. 可被5整除的二进制前缀gfdhy1 天前
【c++】哈希算法深度解析:实现、核心作用与工业级应用百***06011 天前
SpringMVC 请求参数接收weixin_457760001 天前
Python 数据结构一个不知名程序员www1 天前
算法学习入门---vector(C++)云飞云共享云桌面1 天前
无需配置传统电脑——智能装备工厂10个SolidWorks共享一台工作站明洞日记1 天前
【数据结构手册002】动态数组vector - 连续内存的艺术与科学福尔摩斯张1 天前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)fashion 道格1 天前
数据结构实战:深入理解队列的链式结构与实现橘颂TA1 天前
【剑斩OFFER】算法的暴力美学——两整数之和