-
初始化数据结构:
- 使用一个布尔数组
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
相关推荐
じ☆冷颜〃3 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用数据大魔方3 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)POLITE33 小时前
Leetcode 23. 合并 K 个升序链表 (Day 12)楚来客4 小时前
AI基础概念之八:Transformer算法通俗解析Echo_NGC22374 小时前
【神经视频编解码NVC】传统神经视频编解码完全指南:从零读懂 AI 视频压缩的基石会员果汁4 小时前
leetcode-动态规划-买卖股票橘颂TA5 小时前
【剑斩OFFER】算法的暴力美学——二进制求和地平线开发者6 小时前
征程 6 | cgroup sample姓蔡小朋友7 小时前
算法-滑动窗口