【每日一题】最大交换

文章目录

  • Tag
  • 题目来源
  • 解题思路
    • 方法一:暴力法
    • 方法二:贪心
  • 写在最后

Tag

【暴力法】【贪心法】【数组】【2024-01-22】


题目来源

670. 最大交换


解题思路

本题的数据规模比较小,暴力法也可以通过。以下将会介绍暴力法和本题最优法。

方法一:暴力法

思路

对于整数 num 的十进制数位最长只有八位,交换任意两个数位最多有

7 + 6 + 5 + 4 + 3 + 2 + 1 = 28 7+6+5+4+3+2+1=28 7+6+5+4+3+2+1=28

种不同的交换方法。我们统计这些交换后最大的 int 型整数。

算法

class Solution {
public:int maximumSwap(int num) {string str = to_string(num);int n = str.size();int maxNum = num;for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {swap(str[i], str[j]);maxNum = max(maxNum, stoi(str));swap(str[i], str[j]);}}return maxNum;}
};

复杂度分析

时间复杂度: O ( l o g 3 n u m ) O(log^3 \ num) O(log3 num) n u m num num 为给定的整数。 n u m num num 转化成十进制数的时间复杂度为 O ( l o g n u m ) O(log\ num) O(log num),一共有 O ( l o g 2 n u m ) O(log^2 \ num) O(log2 num) 种不同的交换方法。

空间复杂度: O ( l o g n u m ) O(log \ num) O(log num) n u m num num 转化成十进制数有 O ( l o g n u m ) O(log \ num) O(log num) 个数字,需保存 n u m num num 所有的数字。

方法二:贪心

思路

对于 num 的理想最大数:每个数位上的数字都比其后的任意数位上的数字大,否则就要找到排在其后面的最大数,与之交换。

算法

在具体实现中,我们倒序遍历数字字符串 numArray,记录当前遍历到的最大字符位置 mxIdx。如果当前数字字符 numArray[i] 右边有比它大的,即有 numArray[i] < numArray[mxIdx],则将 imxIdx 位置分别记录为 idx1 = iidx2 = mxIdx

我们最终需要交换的是靠近左侧的 idx1idx2

class Solution {
public:int maximumSwap(int num) {string numArray = to_string(num);int n = numArray.size();int mxIdx = n - 1;int idx1 = -1, idx2 = -1;for(int i = n-2; i >= 0; --i) {if(numArray[i] > numArray[mxIdx]) {      // numArray[i] 是目前最大的数字mxIdx = i;}else if(numArray[i] < numArray[mxIdx]) { // numArray[i] 右边有比它大的idx1 = i;idx2 = mxIdx;}}if(idx1 >= 0) {swap(numArray[idx1], numArray[idx2]);return stoi(numArray);}return num;}
};

复杂度分析

时间复杂度: O ( l o g n u m ) O(log \ num) O(log num) n u m num num 为给定的整数。 n u m num num 转化成十进制数有 O ( l o g n u m ) O(log\ num) O(log num) 个数,需要遍历一次所有的数。

空间复杂度: O ( l o g n u m ) O(log \ num) O(log num) n u m num num 转化成十进制数有 O ( l o g n u m ) O(log\ num) O(log num) 个数,需要保存 n u m num num 所有的数字。


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

14027.ptp 控制流

文章目录 1 ptp 控制流1.1 控制流分层 1 ptp 控制流 1.1 控制流分层 大体分为4层&#xff1a;1 ptp4l层&#xff1a; 获取配置文件、创建时钟、poll监控文件描述符。2 clock时钟层&#xff1a;提供提供clock_poll、clock_create、clock_sync 等3 port 端口层&#xff1a;port…

后端MySQL常用命令

不是专业后端的&#xff0c;所有可能有些不太准确&#xff0c;都是自己平时在项目当中总结的&#xff0c;谢谢ฅฅ* 添加/insert 给指定字段添加数据 INSERT INTO 表名 字段名 VALUES 值 INSERT INTO ninth_student (id,name,sex,age,weight,birth) VALUES (0,亚亚,女,18,4…

为什么重写hashcode要一起重写equals方法

为什要重写hashcode&#xff1f; hashcode方法得到一个hash值其实是要起到一个比较作用&#xff0c;比较两个未知的东西是不是同一个东西&#xff0c;因为我们要求hashcode方法产生的hash值对于”同一个东西“得到的hash值是一样的。 那这种特性可以做到去重的效果&#xff0…

HBase学习五:运维排障之复制

官方文档-HBase复制,包含相关命令信息 0 名词解释 在HBase中,HLog(也称为WAL)用于记录所有对HBase表的修改操作,以便在系统故障时可以恢复数据。 Entry的含义 Entry在HLog上下文中通常指的是WAL中的一个记录项。每个Entry包含了一次或多次对HBase表的修改操作的信息,这…

通过 GScan 工具自动排查后门

一、简介 GScan 是一款为安全应急响应提供便利的工具&#xff0c;自动化监测系统中常见位置。 工具运行环境&#xff1a;CentOS (6、7) python (2.x、3.x) 工具检查项目&#xff1a; 1、主机信息获取 2、系统初始化 alias 检查 3、文件类安全扫描 3.1、系统重要文件完整行…

Express.js 中动态路由解码:path-to-regexp介绍

1. path-to-regexp&#xff1a;将路径转化为模式 path-to-regexp 是一个 Node.js 工具&#xff0c;用于将路径字符串转换为正则表达式。它在像 Express.js 这样的网络框架中广泛用于处理动态路由。 主要功能及代码示例&#xff1a; 将路径转换为正则表达式&#xff1a; 它将带…

linux shell脚本 条件语句

test 测试文本的表达式 是否成立 格式&#xff1a; test 条件表达式 格式&#xff1a; [ 条件表达式 ] &#xff08;[] 内要空格 &#xff0c;不然不生效&#xff09; 如何测试&#xff1f; [ 操作符 文件或目录 ] echo $? 返回值是0 正确&#xff0c;返回值非0 …

Unity——FSM有限状态机

有限状态机就是有限个切换状态的条件&#xff0c;要制作有限状态机&#xff0c;有几个必要点&#xff1a;状态抽象类、FSMSystem类、FSMSystem实现类、FSM状态实现类。 每一个控制者都有一个状态机&#xff0c;每一个状态机都有其包含的状态&#xff0c;每一个状态都有能转换的…

运维之道—生产环境安装mysql

目录 1.前言 2.部署安装 2.1 下载mysql5.7版本的yum仓库 2.2 安装yum仓库 2.3 安装mysql-server 2.4 启动mysql-server 3. 生产配置 3.1 登录mysql 3.2 修改root账户密码 3.3 配置mysql

JFinal项目搭建

JFinal项目搭建 JFinal项目搭建 JFinal项目搭建 首先创建maven项目&#xff1a; 删掉报错的jsp页面&#xff1a; 在pom.xml中加入坐标&#xff1a; <dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal-undertow</artifactId>…

零基础学习【Mybatis Plus】这一篇就够了

学习目录 1. 快速入门1-1. 常用注解总结 1-2. 常用配置 2. 核心功能3. 扩展功能4. 插件功能 1. 快速入门 1-1. 常用注解 MybatisPlus中比较常用的几个注解如下&#xff1a; TableName: 用来指定表名Tableld: 用来指定表中的主键字段信息TableField: 用来指定表中的普通字段信…

基于openssl v3搭建ssl安全加固的c++ tcpserver

1 概述 tcp server和tcp client同时使用openssl库&#xff0c;可对通信双方流通的字节序列进行加解密&#xff0c;保障通信的安全。本文以c编写的tcp server和tcp client为例子&#xff0c;openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…

AR 自回归模型

文章目录 总的代码ADF 检验(是否平稳)差分操作拟合AR 模型预测可视化总的代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.ar_model import AutoReg from statsmodels.tsa.stattools import adfuller# 生成一个示例时间序…

在人工智能时代,如何利用AI达到行业领先地位?

人工智能很快将成为企业开展业务的一个必要环节。各企业都会具备AI战略&#xff0c;就像其具有社交媒体战略、品牌战略和人才战略等一样。 因此&#xff0c;如果企业希望在竞争中脱颖而出、获得优势&#xff0c;不能只是使用AI&#xff0c;而是要以AI为先导&#xff0c;创造行业…

pyqtgraph 设置线程阻塞

pyqtgraph 设置线程阻塞 如果想要在 PyQtGraph 应用程序中设置线程阻塞以模拟一个耗时长的任务&#xff0c;可以使用 time.sleep 或者其他会阻塞线程的操作。以下是一个简单的示例&#xff1a; import pyqtgraph as pg from PyQt5.QtCore import Qt, QThread, pyqtSignal imp…

基于springboot+vue的海滨体育馆管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

邮件服务支持Exchange协议,资产历史账号支持设置保留数量,JumpServer堡垒机v3.10.2 LTS版本发布

2024年1月22日&#xff0c;JumpServer开源堡垒机正式发布v3.10.2 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和维护&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS版本&#xff0c;以获得更佳的使用体验。 在v3.10.2 LTS版本中&…

美赛world排版技巧

正在跳转 1、问&#xff1a;Word里边怎样设置每页不同的页眉&#xff1f;如何使不同的章节显示的页眉不同&#xff1f; 答&#xff1a;分节&#xff0c;每节可以设置不同的页眉。文件——页面设置——版式——页眉和页脚——首页不同 2、问&#xff1a;请问Word中怎样让每一…

04 经典的OSPF

思维导图的方式回顾OSPF 什么是OSPF?为什么需要OSPF? - 华为 (huawei.com) 1 ospf 领行学习思维导图 1.1 ospf 的工作过程 建立领据表同步数据库计算路由表1.2 ospf 的状态

用JavaFX写了一个简易的管理系统

文章目录 前言正文一、最终效果1.1 主页面1.2 动物管理页面-初始化1.3 动物管理页面-修改&新增1.4 动物管理页面-删除&批量删除 二、核心代码展示2.1 启动类2.2 数据库配置-db.setting2.3 日志文本域组件2.4 自定义表格视图组件2.5 自定义分页组件2.6 动物管理页面2.7 …