最大交换

news/2024/12/19 0:28:24/文章来源:https://www.cnblogs.com/-citywall123/p/18616102

 

 

本题的关键是越往后找到一个最大的数与越靠前的最小的数进行交换。从右往前遍历,找到右边最大数的位置,和左边最小数的位置进行交换 

时间复杂度为O(len(num))

func maximumSwap(num int) int {numStr := fmt.Sprintf("%d", num)if len(numStr) == 1 {return num}leftMin := -1rightMax := 0// 从右往前遍历,找到右边最大数的位置,和左边最小数的位置进行交换maxIndex := len(numStr) - 1for i := len(numStr) - 2; i >= 0; i-- { //倒数第二个往前遍历//左边值比当前值大,更新最大索引if numStr[i] > numStr[maxIndex] {maxIndex = i} else if numStr[i] < numStr[maxIndex] { //值相等情况,优先取靠右的,因为这样子高位损失最小//左边值比当前值小,分别记录左边最小,右边最大leftMin = irightMax = maxIndex}}if leftMin == -1 { // 这意味着 numStr 是降序的,不需要交换return num}byt := []byte(numStr)tmp := byt[leftMin]byt[leftMin] = byt[rightMax]byt[rightMax] = tmpans, _ := strconv.Atoi(string(byt))return ans
}

 

 

变种,如果要求至少交换一次,要求输出最大值

思路:如果最后发现没有可行的交换,说明整个数据是倒序的,交换最后末尾两个就可以了

func maximumSwap(num int) int {numStr := fmt.Sprintf("%d", num)if len(numStr) == 1 {return num}leftMin := -1rightMax := 0// 从右往前遍历,找到右边最大数的位置,和左边最小数的位置进行交换maxIndex := len(numStr) - 1for i := len(numStr) - 2; i >= 0; i-- { //倒数第二个往前遍历//左边值比当前值大,更新最大索引if numStr[i] > numStr[maxIndex] {maxIndex = i} else if numStr[i] < numStr[maxIndex] { //值相等情况,优先取靠右的,因为这样子高位损失最小//左边值比当前值小,分别记录左边最小,右边最大leftMin = irightMax = maxIndex}}if leftMin == -1 { // 这意味着 numStr 是降序的return swapAnd2Int([]byte(numStr), 0, 1)}return swapAnd2Int([]byte(numStr), leftMin, rightMax)
}func swapAnd2Int(byt []byte, a, b int) int {tmp := byt[a]byt[a] = byt[b]byt[b] = tmpans, _ := strconv.Atoi(string(byt))return ans
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855113.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编基础,寄存器、指令、函数栈(有栈协程)

ref很好的入门视频教程,基础寄存器和基础指令讲得好,https://www.bilibili.com/video/BV12M4m1o7f6 简化了很多细节,但可以粗略入门,https://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html 也是一个简化版,但是比上一个详细,https://www.cnblogs.com/a…

最大流之上下界可行流

一.无汇源上下界可行流#include<bits/stdc++.h>#define x first #define y second #define endl \n #define int long longusing namespace std;const int N=10010,M=200010,INF=1e15;//根据边的大小,来调整N,M,INFint n,m,S,T; int h[N],e[M],f[M],l[M],ne[M],idx;//l数…

项目中ES踩坑记录

当用到script score query 时,出现java 异常 这种异常多半是对检索出来的数据进行script计算的时候出错了,大多数是空指针异常情况。 解决思路是: 1.在query条件中,将需要script计算的字段的数据过滤掉。比如用到了feature字段进行计算的时候,需要保证feature有值并且是512…

从“bug”到“成就感”——软件工程大冒险

从“bug”到“成就感”——软件工程大冒险 这一学期的《软件工程》简直可以称为我的“技术冒险之旅”。从最初的迷茫,到逐渐掌握核心技能,再到团队合作中的互助与共识,到最后顺利完成项目时的“轻舟已过万重山”,经历了从“bug”到“成就感”的转变,既有汗水,也有欢笑。回…

【AI安全漏洞】VLLM反序列化漏洞分析与保姆级复现(附批量利用)

#CVE-2024-9052环境需要 Linux(这里使用kali)、Anaconda首先安装Anaconda 前言 最好使用linux,如果使用windows可能会产生各种报错(各种各种各种!!!),最好使用Anaconda,方便独立管理虚拟机 使用conda创建虚拟机、python要求3.10 conda create -n vllm_beam python=3.…

动态数据源 @DS 注解源码解析

参考:动态数据源切换——@DS 注解源码解析前言 借助 dynamic-datasource 可实现多数据源读写,其核心注解@DS用来动态切换数据源。 下面介绍@DS注解的实现原理。 如何使用 在 pom 中引入依赖: <!-- spring-boot 1.5.x 2.x.x --> <dependency><groupId>com.…

【开源系列】CentOS7下Docker环境搭建开源堡垒机Apache Guacamole

Apache Guacamole 是一个无客户端远程桌面网关。它支持 VNC、RDP 和 SSH 等标准协议。不需要插件或客户端软件。借助 HTML5,一旦在服务器上安装了 Guacamole,只需使用 Web 浏览器即可访问桌面。 1.Guacamole的架构介绍 Guacamole不是一个独立的网络应用程序,而是由多个部分组…

ThreeJs-07操控物体实现家具编辑器

本章节实现效果,通过gui快速添加场景,家具,并且可以快速设置家具实现一个编辑器效果一.基础设置与物体添加列表 用之前做过的一个案例来改首先不要这个模型,然后换个背景颜色,并且添加一个网格辅助器1.1 添加场景 先往事件对象里面添加一个函数,到时候点击就会调用这个函…

数据集划分;参数超参数;交叉验证

在机器学习和深度学习中,将数据分为训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)是常见的做法,每部分数据承担不同的任务: 一.基本概念 1.训练集(Training Set):训练集用于训练模型,即通过算法调整模型的参数以最小化损失函数(Loss Function…

爱米导航网(imi),您的互联网书签搭子

爱米导航(Imi)网是一个综合性的互联网资源聚合平台,它以其丰富的内容和便捷的服务受到了广大用户的喜爱。该网站收录了数千个不同类型的互联网工具网站,覆盖了AI工具、自媒体运营工具、产品经理工具以及UI设计师工具等多个领域,为用户提供了一个一站式的解决方案。 爱米导…

记录一次springboot启动流程不完整版

1.Sort ApplicationInitializer:2.sort Listener:3.getRunListener:4.eventPublishingRunListener.starting 发布启动中事件; 构建 ApplicationArguments 参数, 4.1prepareEnvement: [StubPropertySource {name=servletConfigInitParams}, StubPropertySource {name=servletC…

键盘连击软件解决方案

解决的问题 jjjjjjjjjjjjjjjj键盘连击了,windows系统中的“筛选键”功能就能短暂解决这个问题,可是筛选的时间太长无法在面板设置更短的时间,但可以使用软件解决。 方法一 系统 筛选键 win+i 打开设置 -> 搜索“筛选键” -> 打开筛选键开关 使用限制:重复键最低只能设…