当前位置: 首页 > news >正文

【牛客刷题】 计算01串通过相邻交换变成目标串的最大交换次数

文章目录

  • 一、题目介绍
  • 二、 核心思路分析
  • 三、算法设计:如何计算交换次数?
    • 3.1 :将所有 '1' 移到最左侧
    • 3.2:将所有 '1' 移到最右侧
    • 3.3 取最大值
    • 3.4 为什么这个算法正确?
  • 四、代码实现(Java)
    • 4.1 代码实现
  • 五、复杂度分析
  • 六、总结

一、题目介绍

给定一个由 ‘0’ 和 ‘1’ 组成的字符串,每次操作可以交换相邻的两个字符。

问变换到所有可能的目标串中,所需交换次数最多是多少?

示例
输入:"01000"
输出:3
解释:

  • 变换到 "00001" 需要 3 次交换(将中间的 ‘1’ 逐步右移 3 次)
  • 变换到 "10000" 需要 1 次交换
    由于题目要求交换次数最多的目标串,故答案为 3。

二、 核心思路分析

  1. 关键观察
    所有交换次数最多的目标串,一定是所有 ‘1’ 完全聚集在最左侧最右侧的形式(如 111000000111)。这是因为:

    • 若 ‘1’ 分散在中间,部分 ‘1’ 只需跨越少量 ‘0’ 即可到达目标位置。
    • 而将所有 ‘1’ 移到极端位置时,每个 ‘1’ 必须跨越整个 ‘0’ 的序列,交换次数最大化。
  2. 问题转化
    计算两种极端情况的交换次数:

http://www.dtcms.com/a/335394.html

相关文章:

  • 【深度学习-基础知识】单机多卡和多机多卡训练
  • 【Linux系统】动静态库的制作
  • 接口参数校验工具类ValidationParamUtils,让参数校验从“繁琐、重复”变得“省事、简单”!
  • Python文本过滤与清理完全指南:从基础到高级工程实践
  • go基础学习笔记
  • RAG 分块中表格填补简明示例:Markdown、HTML、Excel、Doc
  • C++核心语言元素与构建块全解析:从语法规范到高效设计
  • 编译器生成的合成访问方法(Synthetic Accessor Method)
  • TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践
  • Linux容器基石:LXC核心概念与实践指南
  • Flink Stream API核心概念继承体系
  • 代码随想录算法训练营四十四天|图论part02
  • 像海绵一样吸收技术书籍的高效学习方法
  • [Go]包管理发展之路(Go Modules VS GOPATH)
  • 【Jenkins】02 - 自动化部署配置
  • 简单的 VSCode 设置
  • 利用vscode时进行调试,即使设置justMyCode为False仍然失败,如何解决?
  • 嵌入式练习项目——————抓包获取天气信息
  • 【Linux | 网络】高级IO
  • SQL性能优化全攻略
  • 基于libcurl与epoll的高性能异步FTP客户端
  • 数据准备|生成折线图
  • 如何让AI视频模型(如Veo)开口说中文?一个顶级提示词的深度拆解
  • Spring Boot 项目配置 MySQL SSL 加密访问
  • 【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
  • 计算机网络 HTTP和HTTPS 区别
  • Rust 条件语句
  • deepseek一键生成word和excel并一键下载
  • 初识CSS
  • [python学习记录1]python简介