首页 web前端 js教程 打印队列

打印队列

Dec 19, 2024 am 02:42 AM

Print Queue

代码来临 2024 年第 5 天

第 1 部分

会有秩序!

这将会是一件很酷的事情。

我喜欢添加的警告,即不应考虑未包含在更新中的页面规则。

我对如何解决这个难题有一个模糊的想法。

但是我需要在这里制定我的策略以保持清晰并确保我准备好编写实际代码。

我希望跌跌撞撞地制定策略

这很有趣。我觉得我知道如何以过度检查的方式解决这个问题。

这就是我的想法。

将两个列表中的第一个转换为页码目录,其前面必须有任何/所有页面:

来自此:

47|53
97|13
97|61
...
登录后复制
登录后复制
登录后复制

对此:

{
  47: [53],
  97: [13, 61],
  ...
}
登录后复制
登录后复制
登录后复制

但是我该如何使用它呢?

等等。旋转!!

查看第一个示例页面更新:

75,47,61,53,29
登录后复制
登录后复制

并审查其正确顺序的深入证明......

...让我想到了过于乏味的方法:

Find all page ordering rules whose two pages are both in the page update list
Find the index of each page
If the first is less than the second
  The order is correct
登录后复制
登录后复制

性能方面的缺点:

  • 这需要遍历每个列表的整套页面顺序规则
  • 似乎是检查所有可能的数字对的任务中的阶乘

不太确定这种方法。

返回我的键对象和“之前”列表。

如果我让对象更全面怎么办:

47|53
97|13
97|61
...

becomes:

{
  47: [ [53], [] ],
  53: [ [], [47] ],
  97: [ [13, 61], [] ],
  13: [ [], [97] ],
  61: [ [], [97] ]
}
登录后复制
登录后复制
  • 第一个嵌套列表列出了必须位于其之前的数字
  • 第二个嵌套列表列出了其后必须出现的数字

理论上(和伪代码):

For each number in the list
  Create an ordered list of the previous numbers
    Check each one for inclusion in the catalogued list associated with that number
      If they are all in there
        Set a flag to true
  Create an ordered list of the subsequent numbers
    Check each one for inclusion in the catalogued list associated with that number
      If they are all in there
        Set a flag to true
  If both flags are true
    Number is in the correct order
登录后复制

示例演练:

75

Before: []
After: [47,61,53,29]

Catalog:
{
  75: [ [29, 47, 53, 61, 13], [97] ]
}

Before: Empty - success

After: [True, True, True, True]

All True? Yes - success

Correct Order
登录后复制

我绝对认为是时候编写一个至少可以构建我的目录对象的算法了。

构建编目算法

将规则从更新列表中分离出来:

let [rules, updates] = input.split('\n\n')
登录后复制

将输入解析为包含 2 项的列表,其中每个项目都是一个数字:

rules = rules.split('\n').map(el => el.split('|').map(Number))
登录后复制

将该列表缩减为一个充满键和列表值的对象:

rules = rules.reduce((obj, item) => {
  if (!(item[0] in obj)) {
    obj[item[0]] = []
  }
  obj[item[0]].push(item[1])
  return obj
}, {})
登录后复制

这是否按预期工作?

是的,它输出这个对象:

{
  '29': [ 13 ],
  '47': [ 53, 13, 61, 29 ],
  '53': [ 29, 13 ],
  '61': [ 13, 53, 29 ],
  '75': [ 29, 53, 47, 61, 13 ],
  '97': [ 13, 61, 47, 29, 53, 75 ]
}
登录后复制

请注意,我回到只记录必须在任何给定数字之后的数字。

那是因为我认为我不必检查双方。

我可能错了。

但我将在这个假设下继续。

检查每个数字后面的所有数字

我将处理第一个示例更新,它应该显示为正确的。

首先,我需要将输入解析为数字列表:

updates = updates.split("\n").map((el) => el.split(",").map(Number));
登录后复制

然后,提取第一个列表进行测试:

let test = updates[0];
登录后复制

现在开始真正的工作。

第一次尝试:

47|53
97|13
97|61
...
登录后复制
登录后复制
登录后复制

它似乎一直有效,直到我在第五个示例列表项上尝试它:

{
  47: [53],
  97: [13, 61],
  ...
}
登录后复制
登录后复制
登录后复制

我的算法检查每个数字是否作为目录中的键存在,并检查其关联列表中的所有数字是否匹配。

但是13不在目录中。我的算法错误地假设了正确的判决。

当它达到 29 时,由于没有更多的数字,它也假设是正确的。

所以,我需要调整我的策略。

第二次尝试:

75,47,61,53,29
登录后复制
登录后复制

这将为每个示例列表生成正确的答案!

它正确检查每个数字后面出现的数字子列表中的每个数字是否包含正在检查的数字(紧邻子列表之前的数字)。

因此,在以下情况下:

Find all page ordering rules whose two pages are both in the page update list
Find the index of each page
If the first is less than the second
  The order is correct
登录后复制
登录后复制

当遇到 13 时,它查找 29 并看到 13,这意味着它们的顺序错误。

将其插入到归约中并将中间数字相加

并没有我想象的那么难:

47|53
97|13
97|61
...

becomes:

{
  47: [ [53], [] ],
  53: [ [], [47] ],
  97: [ [13, 61], [] ],
  13: [ [], [97] ],
  61: [ [], [97] ]
}
登录后复制
登录后复制

它为示例输入生成正确的答案!

它会如何处理我的拼图输入???

它再次生成了正确答案!!!

呜呼!!!

我觉得我有一段时间想得太多了。当我看到什么不起作用时,答案就变得清晰了。

有趣的东西!

第二部分会带来哪些新挑战......?

第2部分

排序练习

我可能应该预见到这一点。

值得庆幸的是,我认为我的算法已经为此做好了准备。

我必须对每个列表进行排序。

排序的工作原理是比较两个值并根据三个结果之一执行两件事之一:

  • 如果排序函数返回 -1,则第一个值位于第二个值之前
  • 如果返回 1,则第二个值应位于第一个值之前
  • 如果返回 0,则不会移动任何值,因为它们相等

我的算法生成布尔值列表。

当所有布尔值都为 true 时,正确生成它们的数字位于所有布尔值之前。

但是,如果任何布尔值为 false,则其中一个数字应位于当前数字之前。

但是如果我要比较两个数字,并且它们的两个列表都有错误值,我怎么知道哪个应该排在第一位?

我真的只有一种方法来解决一个列表全部为真而另一个列表不为真,或者两者都为真的情况。

嗯嗯。

我认为我需要一次对两个数字而不是数字列表执行测试。

与排序的工作原理完全相同:a 与 b

将我的算法调整为一对一战斗而不是一对多战斗

经过一些令人费解的、三元检查和事后猜测,我得出了一个可行的算法:

47|53
97|13
97|61
...
登录后复制
登录后复制
登录后复制

在每个顺序不正确的示例更新上运行它会生成一个正确排序的列表!

我很高兴能在两个输入的所有列表上运行它,并希望今天能获得两颗当之无愧的金星!

俯瞰巨大...小细节

我在示例输入上运行了算法,得到的数字比显示的要大。

我不知道为什么。打印出每个正确排序的列表,证明其元素的顺序正确。

然后我重新阅读了说明:

仅限顺序错误的更新

说得有道理!我正在将每个列表的中间值相加!

修复此问题需要进行一点 slice() 来复制列表,然后比较字符串化版本:

{
  47: [53],
  97: [13, 61],
  ...
}
登录后复制
登录后复制
登录后复制

中提琴!我得到了示例输入的正确答案。

手指交叉,我得到它作为我的拼图输入!

确实!!!

甜甜!!

两颗金星。都是我的!

又一个有趣的谜题。

花了几天时间思考并得出一些策略。

但我最终在迷雾中找到了出路。

进入第六天!

以上是打印队列的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

See all articles