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

最大交换

题目描述

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7。

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  1. 给定数字的范围是 [0, 108]

解题思路

我们需要找到一种方法,通过最多一次交换两个数字,来使得整数尽可能大。最佳的策略是从左到右找到第一个可以通过与右侧较大的数交换而使得结果最大化的位置。

  1. 字符串转换:首先,将整数 num 转换成字符串 charArray,方便单独访问和操作每一个数字。
  2. 初始化变量
    • n 为数字的长度。
    • maxIdx 记录从右向左看当前最大数字的位置。
    • idx1idx2 分别用于记录要交换的两个位置的索引。
  3. 从右向左扫描:为了找到最优的交换机会,我们从右向左遍历字符串。目的是尽可能保证交换后数字的左侧是最大的,这样可以最大化整个数。
    • 如果当前数字大于 maxIdx 所指向的数字,则更新 maxIdx
    • 如果当前数字小于 maxIdx 所指向的数字,这意味着交换当前数字和 maxIdx 所指向的数字可以获得一个更大的数。此时,记录这对索引到 idx1idx2
  4. 执行交换:如果存在有效的交换(idx1 不为 -1),则执行交换并将字符串转换回整数。
  5. 返回结果:如果进行了交换,则返回新的整数;如果没有进行交换(即原数字已经是最大),则直接返回原整数。
class Solution {
public:int maximumSwap(int num) {string charArray = to_string(num);int n = charArray.size();int maxIdx = n - 1, idx1 = -1, idx2 = -1;for (int i = n - 1; i >= 0; i--) {if (charArray[i] > charArray[maxIdx]) {maxIdx = i;} else if (charArray[i] < charArray[maxIdx]) {idx1 = i;idx2 = maxIdx;}}if (idx1 >= 0) {swap(charArray[idx1], charArray[idx2]);return stoi(charArray);} else {return num;}}
};

http://www.mrgr.cn/news/17082.html

相关文章:

  • GD - EmbeddedBuilder_v1.4.1.23782 - PWM官方工程功能记录
  • vscode写markdown(引入html及css语法)
  • 滑模控制2021年12月8日
  • 【MySQL数据库管理问答题】第14章 使用 MySQL InnoDB 集群实现高可用性
  • Driver.js——实现页面引导
  • 深度学习速通系列:Bert模型vs大型语言模型(LLM)
  • 团队比赛时如何给小组记分?
  • 并发编程之CountDownLatchSemaphore原理与应用
  • 算法数学加油站:一元高斯分布(正态分布)Python精美科研绘图(PDF、CDF、PPF、ECDF曲线;QQ图)
  • Git 使用指南 --- 版本管理
  • 【荒原之梦考研数学】考研没有人支持,怎么办?
  • python pyqt statusBar 完整的操作方法详细说明和代码举例
  • 编译原理概述
  • 八皇后问题代码实现(java,递归)
  • ubuntu通过smba访问华为设备
  • 【面试经验】腾讯面试题:在QQ增加电商购物场景,拼多多、京东、淘宝怎么选
  • 13:DCDC电源模块的布局
  • linux环境下安装配置go环境
  • 嵌入式笔试准备
  • JAVA 检查儿童身高是否达标