登录社区云,与社区用户共同成长
邀请您加入社区
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4]。输入:nums = [2,5,6,0,0,1,2
从1995年诞生至今,Java已经走过了近30年的历程。它不仅仅是一种编程语言,更是一个完整的平台和生态系统。Java的成功源于其设计哲学、技术创新和强大的社区支持。无论是对初学者还是经验丰富的开发者,掌握Java都是一项值得投资的技能。
编程道场 在他们的文章中, 什么是敏捷? ,Jen Krieger,Daniel Oh和Matt Takane讨论了Red Hat认为的《 敏捷宣言》中最重要的一句话:“我们正在探索通过开发软件并帮助他人开发软件的更好方法。”我喜欢这句话,因为它有助于理解为什么我们可以在软件开发之外应用“敏捷”。 我们可以用“烹饪”之类的句子代替“开发软件”,这仍然使我们对从事“敏捷烹饪”的人们的心...
我最近在一个下雨了但美丽且装饰有圣诞节的基辅参加了XP Days乌克兰会议。 我进行了编码dojo,并在演讲中与Dima Mindra一起现场演示了配对编程。 演讲之后,我对如何运行Coding Dojo有一些疑问。本文旨在为想要启动Coding Dojo的任何人提供指南。编码Dojo是编程时学习和玩乐的地方简而言之,Dojo是一群程序员的聚集地,他们聚集在一起在编程时获得...
编程道场我最近在一个下雨了但美丽且装饰有圣诞节的基辅参加了XP Days乌克兰会议。 我进行了编码dojo,并在演讲中与Dima Mindra一起现场演示了配对编程。 演讲之后,我对如何运行Coding Dojo有一些疑问。本文旨在为想要启动Coding Dojo的任何人提供指南。编码Dojo是编程时学习和玩乐的地方简而言之,Dojo是一群程序员的聚集地,他们聚集在一起在编...
本文介绍了如何使用栈结构高效求解逆波兰表达式(后缀表达式)。逆波兰表达式的特点是运算符在操作数之后,计算时只需从左到右扫描。栈的LIFO特性完美契合该需求:遇到数字入栈,遇到运算符则弹出栈顶两个数字计算后将结果重新入栈。关键点在于注意减法和除法中操作数的弹出顺序(第一个弹出的是右操作数)。文章提供了Java实现代码,并分析了O(N)的时间复杂度和空间复杂度。这道题展示了栈在处理顺序依赖运算中的核心
【码道】系列博客为Java学习者提供系统学习路径,从基础到高级,理论与实践结合,帮助初学者和开发者掌握Java编程。文章以“Hello World”程序为例,详细解析了Java程序的基本结构、编译运行机制及面向对象概念。通过逐行代码解析,读者可以理解类声明、main方法、输出语句等核心概念,并学习如何编译和运行Java程序。文章还介绍了常见错误及解决方法,并扩展了Hello World程序,展示了
本文解析了LeetCode 160题"相交链表"的解法。通过长度差对齐法,先计算两链表长度差,让较长链表的指针先走差值步,使两指针处于同一起跑线后再同步前进,最终找到交点或确认无交点。该方法时间复杂度O(N+M),空间复杂度O(1),避免了复杂边界条件,体现了预处理思想。关键点包括指针复位、节点对象比较而非值比较,以及无需特殊处理无交点情况。
本文介绍了Leetcode606题将二叉树转换为字符串的解法。关键在于前序遍历时合理处理括号:节点值直接输出,左右子树用括号包裹,但需遵循特定规则:左子树为空而右子树存在时必须保留空括号(),其他情况下空括号可省略以避免歧义。文章详细解析了三种情况处理规则,提供了递归实现代码,并通过示例验证正确性。时间复杂度O(n),空间复杂度O(h)。核心要点是正确处理"左空右不空"的特殊情
本文介绍了一种稳定分区链表的算法。给定单链表和目标值x,要求将小于x的节点排在前面且保持相对顺序。核心思路是使用四个指针维护两个区间(小于x和大于等于x),通过尾插法分别构建两个子链表,最后拼接并处理边界情况。关键点包括:1)尾插法保持稳定性;2)拼接后必须断开原链表的残留指针;3)处理全小或全大的边界情况。该算法时间复杂度O(n),空间复杂度O(1),适用于多种链表重排问题。建议在遍历时先断开当
本文探讨了高效查找字符串中第一个不重复字符的两种解法:数组映射法和HashMap计数法。两种方法都采用"空间换时间"策略,先统计字符频率再查找第一个唯一字符。数组法利用ASCII码作为索引,访问速度快但仅适用于有限字符集;HashMap法通用性强,可处理任意字符但效率稍低。文章对比了两者的时间复杂度、空间复杂度和适用场景,指出数组法在小写字母场景下性能最优,而HashMap更适
在正式开启Java编程之旅前,首要任务便是搭建一个稳定可靠的Java开发环境。这个环境的核心就是JDK,即Java Development Kit(Java开发工具包)。没有JDK,我们就无法编译和运行Java代码。JDK、JRE与JVM的关系:JVM是Java实现“一次编写,到处运行”的关键。它是一个规范,定义了Java字节码如何在特定的硬件和操作系统上执行。不同的操作系统有不同的JVM实现。J
【码道】系列博客为Java学习者提供系统学习路径,涵盖从基础到高级的编程知识。本文重点介绍了Java中的变量和数据类型。变量是存储数据的“容器”,本质上是内存中的一块存储空间,具有名称、类型和值。Java的数据类型分为基本数据类型(如整数、浮点、字符、布尔)和引用数据类型(如类、接口、数组)。文章详细讲解了变量的声明、命名规则、常量定义以及数据类型转换(自动转换和强制转换)。通过实际示例,展示了如
摘要:本文探讨了将二叉搜索树(BST)转换为有序双向链表的经典算法。核心思路是利用中序遍历的性质,通过递归修改节点指针实现原地转换,使用全局变量prev记录前驱节点。重点分析了代码中必须对空树单独判空的原因,防止后续查找头节点时的空指针异常。文章还比较了寻找链表头节点的不同策略,并总结了该问题考察的BST性质理解、指针操作技巧和边界条件处理能力。
本文分析了Leetcode105和106题中通过遍历序列还原二叉树的统一套路。前序+中序和后序+中序构造二叉树的核心思路是:前序/后序确定根节点,中序划分左右子树边界。关键区别在于遍历顺序:前序是"根左右",需先构建左子树;后序倒序是"根右左",必须优先构建右子树,否则会导致递归爆栈。文章通过代码示例和详细调用栈分析,解释了后序+中序情况下先构建右子树的原因
本文详细讲解了如何通过扩展先序遍历序列构建二叉树。核心思路是利用递归和全局游标i,根据先序遍历顺序(根-左-右)逐步构建树结构。遇到非'#'字符创建节点,遇到'#'返回空节点。特别强调在多组测试数据时必须重置游标i=0,避免数据混乱。文章通过代码拆解和流程图示,清晰展示了构建过程,并提供了完整的优化代码,包括节点定义、树构建和中序遍历实现。这种方法是理解二叉树序列化和反序列化的基础,适用于处理带空
本文记录了作者在解决LeetCode 189题"轮转数组"时遇到的典型陷阱。作者最初错误地使用了ArrayList的初始化方式,误以为指定容量就能直接通过索引赋值,导致IndexOutOfBoundsException。通过分析ArrayList的容量(Capacity)与实际大小(Size)的区别,作者认识到应该改用数组实现。最终采用辅助数组法,利用(i + k) % n的取
本文讨论了在非空整数数组中找出唯一出现一次数字的两种解法。异或解法(XOR)通过位运算特性,利用a^a=0和a^0=a的性质,将所有数字异或后得到唯一数,满足O(n)时间和O(1)空间的严格条件,是最优解。HashMap解法通过统计数字出现次数也能得到结果,但需要O(n)额外空间,不满足题目要求。两种方法对比显示:异或解法更高效简洁,专为"成对抵消"场景设计;HashMap解法
本文介绍了使用HashMap实现随机链表深拷贝的标准解法。关键在于建立原节点到新节点的映射关系,通过两趟遍历:第一趟创建所有新节点并存入HashMap,第二趟根据原链表结构设置新节点的next和random指针。这种方法保证了新链表完全独立于原链表,满足深拷贝要求。时间复杂度O(n),空间复杂度O(n)。文章还指出了常见错误,并提到存在更节省空间的解法,但HashMap方案更直观可靠。该解法适用于
摘要 本文介绍了解决旧键盘坏键识别问题的算法思路。题目要求通过比较期望输入串和实际输入串,找出所有坏键并按特定规则输出。核心解决策略包括:1) 统一转为大写字母处理;2) 使用HashSet快速判断字符是否存在;3) 通过遍历期望串顺序输出首次出现的坏键。算法时间复杂度为O(n+m),空间复杂度为O(1)。文中还分析了代码优化点,如避免重复创建Scanner对象等。该方案通过合理使用集合和遍历顺序
循环队列设计中,为避免"队列空"和"队列满"混淆,通常采用数组长度设为k+1的策略。然而,在实现Rear()方法时容易忽略一个关键问题:当队列逻辑上为空时,数组中仍可能存在物理残留的旧数据。本文通过LeetCode 622题案例指出,若未在Rear()方法中先检查队列是否为空,直接读取rear-1位置的数据,可能返回已被逻辑删除的"幽灵数据&quo
摘要: 文章分析了栈的压入弹出序列算法(剑指Offer 31)的常见错误。通过模拟法解题时,若在检查栈顶元素前未判空,会触发EmptyStackException。作者以错误代码为例,指出Java逻辑运算符&&的短路特性导致程序在stack.peek()时可能栈已空。正确做法应优先进行防御性判空(!stack.isEmpty() && stack.peek())。文
摘要: 本文对比了两种解决「宝石与石头」问题的方法。题目要求统计 stones 中属于 jewels 的字符数量。 HashSet 解法(推荐): 时间复杂度:O(|jewels| + |stones|) 利用 HashSet.contains() 的 O(1) 成员判断特性,高效计数。 List 解法(不推荐): 时间复杂度:O(|stones| * |jewels|) ArrayList.co
【码道】系列博客为Java学习者提供了系统的学习路径,涵盖从基础语法到高级特性的内容。本文重点介绍了Java中的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符。算术运算符用于基本数学运算,关系运算符用于比较值,逻辑运算符用于多条件判断,位运算符用于二进制操作,赋值运算符则简化了赋值操作。通过示例代码,文章详细展示了各类运算符的使用方法和注意事项,帮助读者掌握Java编程中的核
【摘要】在解决LeetCode 155最小栈问题时,使用双栈法遇到意外错误:小数字测试通过但大数字失败。问题根源在于Java的Integer对象比较使用了==而非.equals()。Java对-128到127的整数有缓存池,导致小数字比较地址相同,而超出该范围的大数字会创建不同对象,地址比较失败。解决方案是改用.equals()比较或拆箱为基本类型。该问题揭示了Java包装类比较的陷阱,提醒开发者
本文介绍了用栈实现二叉树前序、中序和后序遍历的非递归方法。核心思路是用显式栈模拟递归调用栈,通过控制访问时机实现不同遍历顺序: 中序遍历(左-根-右):左链压栈到底后弹栈访问,再转向右子树 后序遍历(左-右-根):需要prev指针标记已处理节点,确保左右子树都完成才访问根 前序遍历(根-左-右):在压栈时就访问节点,保证根最先被处理 三种遍历的区别仅在于访问节点的时机:前序在第一次遇到时访问,中序
本文详细解析了使用广度优先搜索(BFS)实现二叉树层序遍历的标准模板。通过队列的FIFO特性,利用size变量控制每层节点的处理顺序,确保分层输出结果。文章从核心思想、代码拆解、执行流程到复杂度分析,全面阐述了BFS在二叉树遍历中的应用。该模板不仅适用于基础层序遍历,还可轻松扩展到各种变种题目,是解决分层遍历问题的通用方法。
【码道】系列博客专注于为Java学习者提供系统的学习路径,涵盖从基础语法到高级特性的内容。本文重点介绍了Java中的字符串处理,包括字符串的创建、不可变性、常用操作方法、比较、格式化以及高效字符串构建工具StringBuilder和StringBuffer。通过详细的代码示例,帮助读者深入理解字符串的核心概念和操作技巧,提升Java编程能力。无论是初学者还是有经验的开发者,都能从中获得实用的知识和
码道英语是一款零依赖的Web端AI情景对话应用,通过6大高频场景(如咖啡店、机场)实现沉浸式英语口语练习。AI以角色身份输出地道短句,每句附带中文翻译、音标、重点词解析与接话建议,支持流式渐进渲染、语音朗读与语音输入。纯前端实现(HTML5+CSS3+JS),无需构建,可直接打开使用。数据持久化至localStorage,适配多端。基于OpenAI兼容接口,配置灵活,适合自主学习与教学辅助。
选型这件事,我几乎没有犹豫。首先是前端框架的问题。Vue、React 都很成熟,但这个项目的交互复杂度其实不高:一个轮流出场的故事流、一个输入框、一组建议标签。用框架会引入构建链,用户拿到源码还得,推广成本立即上升。原生 JavaScript 的代码量完全能驾驭这个规模,还保留了「任何一个会打开浏览器的同学都能读懂源码」的朴素价值。其次是后端的问题。故事接龙需要一个对话式的大模型服务,而 GitC
本文以“码道”为名,探索成语接龙与AI的融合,从经典规则与同音字变体出发,构建基于Python的成语接龙AI对弈系统。通过高质量语料库的采集、清洗与索引建立,结合拼音处理与智能策略算法,实现“接得住、接得妙”的AI对弈体验。系统涵盖语料库、拼音处理、AI策略、对弈引擎与交互界面五大模块,兼具理论深度与代码实践,展现传统文化与人工智能的创新碰撞。
聊完"是什么",该聊聊"为什么"。项目立项时,技术选型其实经过了反复权衡,最终决定用最朴素的 Web 三件套,理由如下。不知道你有没有经历过这样的夜晚:台灯亮着,书桌前摊开的作文本上一片空白,笔尖悬在纸面上,迟迟落不下去。审题审了二十分钟,立意改了三次,列出的提纲写了一半又划掉——距离交卷的时间一分一秒地迫近,而你大脑里那些关于"青春"“奋斗”"担当"的素材,像被打乱的拼图一样,怎么也拼不成一篇像
每个程序员大概都有过这样的时刻:简历投出去了,面试通知迟迟不来;或者好不容易拿到面试机会,却在电话面试里因为紧张、表达混乱而丢分。面试这件事,光靠"临场发挥"是不行的,它和考试一样需要**练习**。可现实是——- 找人模拟面试,成本高、时间难约、反馈主观;- 对着题库背题,又和真实面试的氛围相差太远;- 市面上现成的面试刷题产品,要么收费,要么套路化,缺少"对话感"。于是我想:能不能用现在最火的大
码道之上,写代码的人越来越多,写诗的人却越来越少。我常常在想,一个程序员如果只剩下 if/else,那他和一台打印机又有什么区别。诗词是汉族文化里最精巧的表达方式之一,五个字可以装下一座山,七个字可以淌出一条江。我决定把这两件看似毫不相干的事情放在一起——让大模型学会作诗,让网页学会品诗。于是有了「诗韵AI诗词对答对话系统」。它不是一个花架子 demo,而是一个真正跑在浏览器里的、能够与用户一来一
流式思维——理解了 SSE 的本质,也就理解了几乎所有 AI 对话应用的底层脉搏;结构化输出——学会了用提示词协议约束一个"自由散漫"的大模型,让它变成听话的"数据服务员";工程折中——在安全、性能、体验之间做权衡,并在 README 里如实交代所有取舍。如果你也想做一个 AI 小应用,不妨从海龟汤开始。它规则简单、场景明确、反馈即时有爽感,是练习 AI 工程能力的绝佳沙盒。最后,用项目页面上那句
大学英语一直是很多同学心里的"老大难"。四六级、考研英语、雅思托福,每一场考试都像一座山。而背单词更是其中最枯燥、最劝退的环节:拿着一本厚厚的单词书,从 abandon 开始背,背到第三天还是 abandon。背单词纯靠死记硬背,没有词根、联想、谐音这些记忆技巧,背了就忘;语法知识碎片化,定语从句、非谓语动词、虚拟语气这些概念分开都认识,放在句子里就懵;长难句无从下手,考研英语里的句子动辄三四十个
码道手记:星语知答——我用纯前端造了一个 AI 校园问答系统
它把一个"内容供给"的问题,从"存量"变成了"增量"。传统游戏面对的问题是"内容总有一天会耗尽",而接入大模型之后,内容供给变成了无限的。但它也带来了新的工程问题:格式不可控、输出有延迟、偶尔会抽风。用系统提示词把自由度收窄到可控范围——能枚举就枚举,能限定就限定;对流式输出做缓冲式消费——拼完整再解析,同时对脏输入做防御;给每一次远程调用兜底——超时、中断、失败,UI 上都要有交代。如果你也想做
在人工智能快速渗透到日常开发的今天,越来越多的开发者开始尝试把大语言模型的能力嵌入到网页应用里。常见的做法不外乎两种:要么直接调用一个封装好的 SDK,要么照着官方文档写一个fetch请求。但真正把"流式输出"“结构化返回”"游戏实时联动"这三件事串起来做一遍,体会是完全不一样的。"贪吃蛇文字版"这个项目的出发点很朴素。我们手头有一段运行良好的 Python 参考代码,它通过requests库以流
本文复盘了从一段Python流式调用代码出发,打造纯前端“成语接龙AI对话”项目的全过程。项目以零框架、零后端的极简架构,实现流式交互、结构化JSON输出、国风界面与本地持久化,完整封装了SSE流解析、系统提示词设计、状态管理与用户体验优化等关键技术。通过实战揭示大模型接口的本质是协议与边界,强调“协议先行”的工程思维,最终交付一个可直接运行的开源作品,为前端与AI交互学习提供深度参考。
码道 · 歌词大比拼开发手记:AI 出上一句,等你来接下句。
放松心情,体验不同人物交流
猜数字是一个几乎人人都会玩的经典小游戏:系统在心里藏一个数字,玩家一次次地猜,系统一次次地给出"大了"或"小了"的反馈,直到命中答案。这个游戏规则简单到可以用一句话讲完,却蕴含着二分查找、信息论、概率与策略优化这些深刻的思想。本文完整记录了一个趣味猜数字网页游戏从立项、设计、开发到测试、上线的全过程。
技术选型是项目立项后的第一个决策。方案 A:Python 后端 + 网页前端。这是很多人会走的路线——Flask 或 FastAPI 起一个服务,后端负责转发 AI 请求,前端负责展示。好处是逻辑清晰,坏处是用户要装 Python 环境、要起服务、要管 CORS,对"打开就能玩"这个目标极不友好。方案 B:Node.js 中间层。思路和 A 类似,只是换了个运行时,至少不需要 Python 环境,