LeetCode 868. 二进制间距

LeetCode 868. 二进制间距

题目描述

给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离。如果不存在两个相邻的 1,返回 0

  • 距离定义为两个 1 的索引差值的绝对值(索引从最低位(0)开始向右增加)。
  • 示例:
    • 输入:n = 22 (二进制 10110),输出:2
    • 解释:22 的二进制是 10110,1 的位置为 1、2、4,相邻的 1 之间的距离分别为 1 和 2,最大为 2。

解法一:遍历每一位 + 记录上一个 1 的位置(最直观)

思路

从低位到高位依次检查 n 的每一位,用变量 last 记录上一个 1 出现的索引。当遇到一个新的 1 时,若 last 不是初始值 -1,则计算当前索引 ilast 的差值,更新最大距离 res。最后返回 res

代码

classSolution{public:intbinaryGap(int n){int res =0, last =-1;// n 最大 10^9 < 2^30,检查 30 位即可for(int i =0; i <30;++i){if((n >> i)&1){// 当前位为 1if(last !=-1){ res =max(res, i - last);} last = i;// 更新上一个 1 的位置}}return res;}};

举例分析

n = 22(二进制 10110)为例,索引从低位到高位:

i(n>>i)&1last (更新前)计算距离更新后 lastres
00-1--10
11-1不计算10
2112-1=121
302-21
4124-2=242

最终 res = 2,正确。

复杂度分析

  • 时间复杂度:O(位数) ≈ O(30) = O(1)
  • 空间复杂度:O(1)

解法二:逐位扫描 + 计数(另一种巧妙解法)

思路

同样从低位到高位扫描,用变量 cnt 记录从上一个 1 到当前位置所经过的位数(即当前已经遇到的连续 0 的个数 + 1)。初始化 cnt 为一个极小的负数(如 INT_MIN/2),确保第一个 1 出现时不会错误更新答案。

  • 遇到 0:cnt++,表示距离增加 1。
  • 遇到 1:
    • 用当前 cnt 更新最大距离 ans
    • 重置 cnt = 1,表示从当前这个 1 开始,到下一个可能的 1 至少相隔 1 位。
  • 循环结束返回 ans

代码

classSolution{public:intbinaryGap(int n){int ans =0, cnt = INT_MIN /2;// 初始为极小负数,避免第一个 1 误更新while(n >0){if(n %2==0){// 当前最低位为 0 cnt++;}else{// 当前最低位为 1 ans =max(ans, cnt); cnt =1;} n /=2;// 右移一位}return ans;}};

举例分析

仍以 n = 22(二进制 10110)为例,从低位向高位处理:

  • 初始:ans = 0, cnt = INT_MIN/2(假设 -1073741824)
  • 第 0 位(0):cnt++ → cnt = -1073741823
  • 第 1 位(1):遇到第一个 1,ans = max(0, -1073741823) = 0,cnt = 1
  • 第 2 位(1):ans = max(0, 1) = 1,cnt = 1
  • 第 3 位(0):cnt++ → cnt = 2
  • 第 4 位(1):ans = max(1, 2) = 2,cnt = 1

最终 ans = 2

复杂度分析

  • 时间复杂度:O(log n) ≈ O(30)
  • 空间复杂度:O(1)

两种解法对比

解法核心思想优点细节注意
解法一记录上一个 1 的索引,直接计算差值逻辑清晰,容易理解需要循环 30 位
解法二用计数器累积距离,遇 1 更新并重置代码更简洁,无需显式索引初始值需设为极小负数

两种方法本质上都是扫描所有二进制位,时间复杂度相同,可以根据个人喜好选择。


总结

本题是二进制位运算的基础题,主要考察对二进制表示的遍历和相邻 1 之间距离的计算。掌握这两种解法后,可以轻松应对类似的位操作问题。

Read more

人工智能:自然语言处理在金融领域的应用与实战

人工智能:自然语言处理在金融领域的应用与实战

人工智能:自然语言处理在金融领域的应用与实战 学习目标 💡 理解自然语言处理(NLP)在金融领域的应用场景和重要性 💡 掌握金融领域NLP应用的核心技术(如文本分类、情感分析、风险评估) 💡 学会使用前沿模型(如BERT、GPT-3)进行金融文本分析 💡 理解金融领域的特殊挑战(如金融术语、数据噪声、实时性要求高) 💡 通过实战项目,开发一个金融风险评估应用 重点内容 * 金融领域NLP应用的主要场景 * 核心技术(文本分类、情感分析、风险评估) * 前沿模型(BERT、GPT-3)在金融领域的使用 * 金融领域的特殊挑战 * 实战项目:金融风险评估应用开发 一、金融领域NLP应用的主要场景 1.1 文本分类 1.1.1 文本分类的基本概念 文本分类是对金融文本进行分类的过程。在金融领域,文本分类的主要应用场景包括: * 新闻分类:对金融新闻进行分类(如“股票新闻”、“债券新闻”

By Ne0inhk
人工智能:多模态大模型原理与跨模态应用实战

人工智能:多模态大模型原理与跨模态应用实战

人工智能:多模态大模型原理与跨模态应用实战 1.1 本章学习目标与重点 💡 学习目标:掌握多模态大模型的核心原理、跨模态特征融合方法,以及基于多模态模型的图文生成与理解任务实战流程。 💡 学习重点:理解多模态模型的架构设计,学会使用 Hugging Face 生态工具调用 CLIP 与 BLIP-2 模型,完成图文检索与图像描述生成任务。 1.2 多模态大模型的核心概念与发展背景 1.2.1 什么是多模态大模型 💡 多模态大模型是指能够同时处理文本、图像、音频、视频等多种不同类型数据的人工智能模型。它打破了传统单模态模型的信息壁垒,实现了跨模态的理解与生成。 多模态大模型的核心能力体现在两个方面: * 跨模态理解:实现不同模态数据之间的关联分析,例如根据文本描述查找对应图像、根据图像内容生成文字摘要。 * 跨模态生成:以一种模态数据为输入,生成另一种模态的数据,例如文本生成图像、图像生成文本、语音生成视频等。 与单模态大模型相比,多模态大模型更贴近人类的认知方式。人类在认识世界的过程中,本身就是通过视觉、听觉、语言等多种感官渠道接收和处理信息的。

By Ne0inhk
AI的提示词专栏:错误定位 Prompt,快速定位异常堆栈

AI的提示词专栏:错误定位 Prompt,快速定位异常堆栈

AI的提示词专栏:错误定位 Prompt,快速定位异常堆栈 本文聚焦错误定位 Prompt 的设计与应用,先阐释异常堆栈的核心构成及开发者定位错误时的信息过载、经验依赖等痛点,明确错误定位 Prompt 需实现信息提取、根因推测、行动指南三大目标。接着分别给出适用于新手的基础模板与面向资深开发者的进阶模板,结合 Python 索引越界、微服务订单创建错误等案例展示模板实战效果。还介绍了针对 Java、Python、JavaScript 等多语言及数据库、分布式链路等特殊场景的 Prompt 适配技巧,提出通过约束输出细节、添加负面清单、示例引导优化模型输出的方法,最后以章节总结和含思路点拨的课后练习巩固知识,助力开发者借助 Prompt 高效定位不同场景下的程序错误。 人工智能专栏介绍     人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。无论你是刚接触 AI 的新手,还是有一定基础想提升的人,都能在这里找到合适的内容。

By Ne0inhk
人工智能大模型应用开发:从微调适配到场景落地

人工智能大模型应用开发:从微调适配到场景落地

一、人工智能大模型应用开发:从微调适配到场景落地 1.1 本章学习目标与重点 💡 掌握大模型应用开发的核心流程,包括模型选型、微调适配、功能封装、部署上线等关键环节; 💡 熟练运用主流大模型框架(Hugging Face Transformers、LangChain、LlamaIndex 等),实现文本生成、问答系统、智能助手等常见应用; 💡 理解大模型微调的核心技术(全参数微调、LoRA、QLoRA 等),能够根据数据规模和硬件资源选择合适的适配方案; 💡 通过真实场景案例(企业知识库问答、智能客服、代码生成助手),掌握大模型从技术适配到业务落地的端到端开发能力。 ⚠️ 重点关注:大模型的上下文窗口限制、生成内容的准确性与安全性、微调过程中的显存优化、以及生产环境下的性能与稳定性平衡。 1.2 大模型应用开发基础:选型与环境搭建 大模型应用开发的第一步是明确业务需求,选择合适的模型并搭建稳定的开发环境。本节将从模型选型原则、主流开发框架介绍、环境搭建实操三个维度,为后续开发奠定基础。 1.2.1

By Ne0inhk