670. 最大交换

思路:

看到这题我第一反应就是想到下一个排列,不过很快发现这两题并没办法使用同一种思路,因为这一题是要求最大,且只能交换一次,相当于多了很多别的限制。

初步的思路是,直接将数组排序,然后和原来的数组从左往右不断对比,如果一样就下一位,如果不一样则往数组后面找到这个最大数,然后交换位置,交换完就直接break即可:

    public int maximumSwap(int num) {if(num<10) return num;char[] ary = (num+"").toCharArray();char[] copy = new char[ary.length];System.arraycopy(ary,0,copy,0,ary.length);Arrays.sort(copy);for(int i=0;i<ary.length;i++){char tmp = copy[ary.length-1-i];if(ary[i]!=tmp){int idx = i;for(int j=i+1;j<ary.length;j++){if(ary[j]==tmp) idx = j;}ary[idx] = ary[i];ary[i] = tmp;break;}}return Integer.parseInt(new String(ary));}

但是这样嵌套了两层循环而且发生了排序,实在不够优雅,因为我们还需要可以去找这个大数对应的索引,那么我们不如这样,我们记录每个数的后面(包括本身)的最大数值的索引,最后从左往右遍历数组观察是否最大数和当前数一样,若不一样则交换后break,若一样就下一位,这样就可以不用排序啦:

    char[] chars = Integer.toString(num).toCharArray();int maxIdx = chars.length - 1;int[] maxArr = new int[chars.length];for (int i = chars.length - 1; i >= 0  ; i--) {if (chars[i] > chars[maxIdx]) {maxIdx = i;}maxArr[i] = maxIdx;}for (int i = 0; i < chars.length; i++) {if (chars[maxArr[i]] != chars[i]) {char temp = chars[maxArr[i]];chars[maxArr[i]] = chars[i];chars[i] = temp;break;}}return Integer.parseInt(new String(chars));

这里顺带补充一下其他知识,parseInt和valueOf的区别:
1、返回值不同
parseInt 返回值是int型
valueof 返回值是Integer型

    public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);}

2、valueof就是调用了parseInt方法的

    public static Integer valueOf(String s) throws NumberFormatException {return Integer.valueOf(parseInt(s, 10));}

3、parseInt效率比valueof效率高

力扣解题思路:670. 最大交换/parseInt和valueOf的区别相关推荐

  1. 力扣解题思路:位运算系列

    交换两个整数 思路:给定a,b用位运算交换两个数的值: a = a ^ b; b = a ^ b;//b = a ^ b ^ b (这里a,b是初始a,b) a = a ^ b;//a = a ^ b ...

  2. 力扣解题思路:脑筋急转弯系列

    172. 阶乘后的零 思路:给定一个整数 n,返回 n! 结果尾数中零的数量. 我们知道,尾部的 0 由 2 * 5 得来,2 的数量明显多于 5 的数量,因为2永远先于5出现,因此只要统计有多少个 ...

  3. 力扣解题思路:488. 祖玛游戏

    488. 祖玛游戏 思路: 实际上就是简单的消消乐,如果时间允许,最简单的暴力递归法也是可以的,就是把所有字母插入所有的位置,取最短且可以消去的插入球数即可.但是这样无脑插入是很浪费时间的,所以我们在 ...

  4. 力扣解题思路:java 解数独

    37. 解数独 思路:编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个 ...

  5. parseint与valueOf的区别

    string转int中的parseint与valueOf ①首先我们先来了解什么是装箱与拆箱: 装箱:普通类型转换为包装类型 Eg:integer i=10; 拆箱:包装类转换为普通类型 Eg:int ...

  6. ​力扣解法汇总670-最大交换

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...

  7. 力扣解题——求根到叶子节点数字之和

    难度:中等 题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到 ...

  8. Java Integer类中的parseInt和valueOf的区别

    如果我们想把一个字符串转化成int类型,那么Integer类里的parseInt()和valueOf()都可以实现. 但是既然有两个方法实现该功能,那么两个方法一定是有区别的. 首先来看parseIn ...

  9. 力扣小周推荐——最大交换

    文章目录 我的做法 更新时间复杂度更低的方法 小周让我做的一道题,俺kuakua两下,不到俩小时就做完了,虽然也不快,但也狠狠平复了轮换数组那道题的伤o(╥﹏╥)o 我的做法 思路:从第一个位置开始, ...

最新文章

  1. pytorch模型转onnx-量化rknn(bisenet)
  2. 网络营销外包——网络营销外包专员如何提升首页关键词的转化率
  3. 交叉编译inetutils并配置telnet服务
  4. python golang 小工具_使用Go语言简单模拟Python的生成器
  5. 这样讲闭包,你终生难忘
  6. 大数据笔记--Spark机器学习(第一篇)
  7. 插入排序、冒泡排序、归并排序、快速排序
  8. 支付宝扫码枪收银的实现原理你了解吗?
  9. android toast 大小,Android Toast实现全屏显示
  10. 2021react复习
  11. vue基于Echarts的拖拽数据可视化功能实现
  12. Oracle EBS Workflow简介和客制之后的感想
  13. python正态分布拟合曲线怎么打印出中位数值,如何用对数正态分布函数拟合数据...
  14. Java Web项目是怎么跑起来的?
  15. jQuery—常用API(jQuery 属性操作、jQuery 文本属性值、jQuery 元素操作)
  16. 资金、时间、盈利“三杀坎”,外卖尾部平台如何求生?
  17. 多元线性回归的正规方程解
  18. Python笔记(1-20)
  19. 云原生可观察性之日志管理
  20. 调优为王!阿里巴巴彩版java性能调优实战,终于到手了!

热门文章

  1. 外包没有资格 WFH?
  2. fgo服务器维护抽卡,fgo抽卡机制讲解 fgo卡池概率分析
  3. multi-class分类模型评估指标的定义、原理及其Python实现
  4. 张一鸣 90 亿购得元宇宙入场券,谁将是头号玩家?
  5. 鸿蒙系统上市前你还买华为吗,鸿蒙并非首发于P50,华为4G新机提前截胡,直接搭载鸿蒙系统上市...
  6. FlexCell demo
  7. python输入_Python输入
  8. 如何提高自己博客的人气
  9. Huggingface填坑:Unexpected key(s) in state_dict: “roberta.pooler.dense.weight“....
  10. 任正非:过去我们是为了赚点小钱,现在是要战胜美国