打印队列

打印队列

代码来临 2024 年第 5 天

第 1 部分

会有秩序!

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

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

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

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

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

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

这就是我的想法。

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

来自此:

47|5397|1397|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 listfind the index of each pageif the first is less than the second  the order is correct

性能方面的缺点:

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

不太确定这种方法。

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

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

47|5397|1397|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

示例演练:

75before: []after: [47,61,53,29]catalog:{  75: [ [29, 47, 53, 61, 13], [97] ]}before: empty - successafter: [true, true, true, true]all true? yes - successcorrect order

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

构建编目算法

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

let [rules, updates] = input.split('nn')

将输入解析为包含 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];

现在开始真正的工作。

第一次尝试:

let results = test.map((num, index) => {  if (num in rules) {    let afters = test.slice(index + 1);    let bools = afters.map((item) => rules[num].includes(item));    return bools.every((el) => el == true) ? true : false;  } else {    return true;  }});

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

61, 13, 29

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

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

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

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

第二次尝试:

let results = test.map((num, index) => {  let afters = test.slice(index + 1);  if (afters.length) {    let bools = afters.map((el) => {      if (!(el in rules)) {        return true;      } else {        return rules[el].includes(num) ? false : true;      }    });    return bools.every((el) => el == true) ? true : false;  } else {    return true;  }});

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

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

因此,在以下情况下:

61, 13, 29

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

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

并没有我想象的那么难:

let part1 = updates.reduce((total, list) => {  let result = list    .map((num, index) => {      let afters = list.slice(index + 1);      if (afters.length) {        let bools = afters.map((el) => {          if (!(el in rules)) {            return true;          } else {            return rules[el].includes(num) ? false : true;          }        });        return bools.every((el) => el == true) ? true : false;      } else {        return true;      }    })    .every((el) => el == true);  if (result) {    total += list[math.floor(list.length / 2)];  }  return total;}, 0);

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

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

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

呜呼!!!

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

有趣的东西!

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

第2部分

排序练习

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

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

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

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

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

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

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

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

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

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

嗯嗯。

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

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

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

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

function orderer(a, b) {  let atest = b in rules ? (rules[b].includes(a) ? false : true) : true;  let btest = a in rules ? (rules[a].includes(b) ? false : true) : true;  if (atest == false) {    return 1;  } else if (btest == false) {    return -1;  } else if (atest == btest) {    return 0;  }}

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

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

俯瞰巨大…小细节

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

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

然后我重新阅读了说明:

仅限顺序错误的更新

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

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

let part2 = updates.reduce((total, list) => {  let copy = list.slice().sort(orderer);  if (copy.join("") !== list.join("")) {    total += copy[Math.floor(copy.length / 2)];  }  return total;}, 0);

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

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

确实!!!

甜甜!!

两颗金星。都是我的!

又一个有趣的谜题。

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

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

进入第六天!

以上就是打印队列的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1499271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
改变范式:从过早的重构和虚假的“可重用性”到适应性、可扩展性和可靠性
上一篇 2025年12月19日 21:39:51
如何处理异步操作
下一篇 2025年12月19日 21:40:01

相关推荐

  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2026年5月10日
    000
  • Golang使用Protobuf定义接口与消息格式

    Protobuf通过字段编号实现兼容性,新增字段可忽略、删除字段可保留编号,确保新旧版本互操作,支持服务独立演进。 在Golang项目中,利用Protobuf定义接口和消息格式,本质上是为服务间通信构建了一套高效、类型安全且跨语言的契约。它让数据结构清晰可见,RPC调用标准化,极大地简化了分布式系统…

    2026年5月10日
    000
  • HTML文档的基本结构是什么? 3分钟带你了解HTML文档基础框架

    html文档的基础结构由四部分组成:1. 声明,用于告知浏览器以html5标准模式解析页面,避免怪异模式导致的兼容性问题;2. 根元素,包裹整个文档内容,并可通过lang属性指定语言;3. 头部区域,包含元数据如设置字符编码、实现响应式布局、定义页面标题、引入css和favicon、加载脚本等;4.…

    2026年5月10日
    000
  • Android和iOS系统下,HTML+JS代码运行结果差异:为什么input宽度为0时,Android输入方向异常?

    Android和iOS系统HTML+JS代码运行差异分析:input宽度为0引发的Android输入方向异常 开发OTP输入组件时,我们发现一个有趣的现象:当input元素的宽度设置为0 (style=”width: 0;”)时,Android系统下的输入方向会异常,而iOS系统则正常工作。 移除w…

    2026年5月10日
    000
  • JavaScript设计原则_JavaScript可维护代码

    每个函数应只做一件事,如拆分数据处理与DOM操作,命名体现功能(如formatDate),长度控制在20行内;2. 使用清晰命名(如currentUser、isValid)减少注释依赖,关键逻辑注明“为什么”;3. 按功能模块化组织代码,如api.js处理请求,utils.js存放工具函数,使用im…

    2026年5月10日
    000
  • C++如何编译和链接_C++从源码到可执行文件的过程解析

    c++kquote>预处理展开宏和头文件,编译生成汇编代码,汇编转为机器码,链接合并目标文件与库生成可执行程序。 当你写完一段C++代码,比如一个简单的hello world程序,最终能运行起来,背后其实经历了一系列步骤:预处理、编译、汇编和链接。这个过程将人类可读的源码转换成机器可以执行的程…

    2026年5月10日
    000
  • Python继承中父类属性的初始化与访问策略

    本文深入探讨python面向对象编程中,子类如何正确初始化和访问父类属性。重点分析`super().__init__()`的工作原理,解释在继承链中参数传递的重要性,并提供通过子类构造函数传递参数的解决方案。此外,针对子类需要与特定父类实例交互的场景,文章还介绍了组合(composition)模式的…

    2026年5月10日
    000
  • javascript生命周期钩子是什么_组件有哪些关键阶段?

    JavaScript原生无生命周期钩子,这是Vue、React等框架为组件设计的机制;Vue按创建、挂载、更新、卸载四阶段提供对应钩子,React类组件有明确生命周期方法,函数组件则通过useEffect模拟,其核心价值在于精准控制执行时机以避免DOM操作错误和内存泄漏。 JavaScript 本身…

    2026年5月10日
    000
  • 解决PHP foreach循环中变量“继承”问题:理解与避免意外数据泄露

    本文探讨PHP foreach循环中一个常见的陷阱:当循环内部的数组或变量未被显式初始化时,其值可能会“继承”自上一次循环迭代,导致意外的数据泄露和逻辑错误。文章将深入分析这一现象的根源,并通过示例代码展示如何通过在每次迭代开始时正确初始化变量来解决此问题,确保代码行为的预期一致性。 引言:fore…

    2026年5月10日
    100
  • 为什么专注如此重要?

    在快节奏的数字时代,程序员能否保持专注直接影响着代码质量、项目进度和错误率。 高效专注,才能在开发过程中游刃有余。本文将分享一些实用技巧,助您提升编程专注力,高效完成任务。 专注力为何如此重要? 专注力是程序员的核心竞争力。编码需要高度集中,处理细节、逻辑和问题,稍一分神就可能导致错误百出,返工耗时…

    2026年5月10日
    000
  • JavaScript中逻辑AND运算符的语法陷阱解析

    本文深入探讨了javascript中逻辑and (`&&`) 运算符在特定场景下引发语法错误的原因。通过对比 `1 && {}` 和 `{} && 1` 两种表达式,揭示了javascript解析器对对象字面量 `{}` 的不同解释机制,特别是当 `{…

    2026年5月10日
    000
  • Go语言:检查预编译库的构建版本与平台信息

    本文详细介绍了如何利用go语言内置的`go tool pack`工具,从预编译的go静态库(`.a`文件)中提取其构建信息,包括go编译器版本、操作系统和cpu架构。当`go build`因库版本不匹配而失败时,此方法能帮助开发者准确诊断问题,确保构建环境与库的兼容性。 在Go语言的开发实践中,我们…

    2026年5月10日
    000
  • JavaScript中实时获取表单输入值:避免常见陷阱

    本教程深入探讨在javascript中如何正确地实时获取html表单输入框的值。许多开发者在初次尝试时可能遇到`alert`函数无法显示最新输入内容的问题,这通常是由于变量作用域和代码执行时机不当所致。文章将通过对比错误与正确的代码示例,详细解释其背后的原理,并提供最佳实践,确保您能够准确捕获用户在…

    2026年5月10日
    000
  • 如何理解C++中指针的类型决定了它如何解释内存

    指针的类型决定内存解释方式,包括读取字节数和算术运算步长。例如int读4字节,char读1字节,且p++按类型大小移动地址,确保数组正确遍历,编译器依类型生成访问指令,类型不同则数据解释结果不同,故指针类型至关重要。 在C++中,指针的类型决定了它如何解释所指向的内存,这主要体现在两个方面:一是每次…

    2026年5月10日
    000
  • 掌握 ESeatures:JavaScript 中的 let、const 和类

    深入理解ES6特性:let、const与类 ECMAScript 2015 (ES6) 引入了一系列强大的特性,彻底革新了JavaScript开发。其中,let、const和class关键字对于编写现代化、简洁高效的JavaScript代码至关重要。 1. let关键字 let用于声明具有块级作用域…

    2026年5月10日
    000
  • 使用 populateDropdown 简化您的下拉菜单管理

    让我们开始吧!假设您正在构建一个动态 web 应用程序,常见任务之一是根据各种数据源填充下拉菜单。如果没有简化的方法,您会发现自己编写重复且容易出错的代码,这对于维护来说可能是一场噩梦。这时,一个简单而强大的函数(如 populatedropdown)可以发挥作用。它消除了麻烦,让您的生活变得更加轻…

    2026年5月10日
    000
  • BOM中如何检测用户的剪贴板内容?

    BOM中如何检测用户的剪贴板内容?BOM中如何检测用户的剪贴板内容?BOM中如何检测用户的剪贴板内容?BOM中如何检测用户的剪贴板内容?

    浏览器直接访问剪贴板内容受限的原因是为了保护用户隐私和安全,防止恶意网站窃取敏感信息。解决方案包括:1. 监听 cut 和 copy 事件以获取用户选中的文本;2. 使用需用户授权的异步剪贴板 api 读取内容;3. 对于不支持异步 api 的浏览器,可使用过时但兼容的 document.execc…

    2026年5月10日 用户投稿
    000
  • JavaScript解释器_javascript代码执行

    JavaScript通过引擎解析执行,先语法分析生成AST,再编译为字节码或机器码,最后执行;执行时创建上下文并入栈,同步代码直接运行,异步任务由API处理后回调入队,事件循环在调用栈空时将回调推入执行;此机制解释了变量提升、暂时性死区及宏任务与微任务执行顺序差异。 JavaScript代码的执行依…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信