为什么80%的码农都做不了架构师?>>>   

问题:

Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly the same digits existing in the integer and is greater in value than n. If no such positive 32-bit integer exists, you need to return -1.

Example 1:

Input: 12
Output: 21

Example 2:

Input: 21
Output: -1

解决:

【题意】给定一个正的32位整数n,你需要找到最小的32位整数,其整数n中的数字完全相同,并且数值大于n。 如果不存在这样的正32位整数,则需要返回-1。

① 本题实质上可以转换为求当前全排列的下一个排列(Next Permutation)。所以,从后向前扫描,找到第一个降序的位置,然后找到右侧第一个大于该位置的值的数,交换这两个数,然后反转该位置之后的数,就可以得到想要的结果。如果整体都是升序的,就返回-1.

1  2  7  4  3  1 ----- 找到第一个降序的位置

1  2  7  4  3  1 ----- 找到其右侧开始找第一个大于它的值

1  3  7  4  2  1 ----- 交换这两个值

1  3  1  2  4  7 ----- 因为开头变了,反转之后的排列

class Solution {//4ms
    public int nextGreaterElement(int n) {
        String str = String.valueOf(n);
        char[] schar = str.toCharArray();
        int len = schar.length;
        int i;
        for (i = len - 1;i > 0;i --){
            if (schar[i] > schar[i - 1]) break;
        }
        if (i == 0) return -1;
        for (int j = len - 1;j >= i;j --){
            if (schar[j] > schar[i - 1]){
                swap(schar,i - 1,j);
                break;
            }
        }
        reverse(schar,i,schar.length - 1);
        long res = Long.parseLong(String.valueOf(schar));//防止转换后的结果越界
        return res > Integer.MAX_VALUE ? -1 : (int)res;
    }
    public void swap(char[] schar,int i,int j){
        char tmp = schar[i];
        schar[i] = schar[j];
        schar[j] = tmp;
    }
    public void reverse(char[] schar,int i,int j){
        while (i < j){
            swap(schar,i ++,j --);
        }
    }
}

转载于:https://my.oschina.net/liyurong/blog/1605052

重新排列数字使其刚好比当前值大 Next Greater Element III相关推荐

  1. dfs入门排列数字问题(一看就懂的讲解)

    dfs入门排列数字问题 dfs入门排列数字问题 一.问题概述 二.问题分析 三.代码分析 (一).如何表示填写完成 (二).如何判断该填哪个数 (三).如何表示填空 (四).实现dfs 四.代码全览 ...

  2. DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)

    DFS (深搜), 也有说就是递归的 执着: 一直搜到底,然后回溯下一个节点 数据结构 : stack (这里的栈,实际上是编译器内部的栈, 所以说也可以看成递归, 递归内部也是调用编译器内部栈) 空 ...

  3. ---排列数字---

    排列数字(回溯的应用) 题目链接,点击直达 题解: 1.用path数组来保存排列 2.bool st[]数组来标识当前数字是否被用过 3.dfs继续递归下一层 4,恢复现场,第 i 个位置填写某个数字 ...

  4. 在()里填上1—9这九个数字使除法算式成立,每个括号内的数字不相同。

    在()里填上1-9这九个数字使算式成立,每个括号内的数字不相同. ()()/()=()()/()=()()/() 符合条件的算式有三组,他们的求解结果分别是7.5,7和9 ('19/2', '38/4 ...

  5. python代码 输入数字使其反向输出

    # 输入数字使其反向输出num = int(input("请输入一个数:"))i = 0num1 = numwhile True:if num1 // 10 == 0:breaki ...

  6. python求组合数c_python实现排列组合公式C(m,n)求值

    python实现排列组合公式C(m,n)求值 实验六 理解浮点数运算的误差 实验目的: 1.理解组合数定义式的化简 2.理解浮点数运算的误差可能带来的问题 错误代码 def func(m,n): re ...

  7. 数字经济建设在数字新技术体系上,数字新技术主要包括物联网、云计算、大数据、人工智能、区块链等五大技术

    40年以来,中国经济发展经历两大历史性变革,第一次是20世纪八九十年代,从计划经济转向市场经济,社会生产力大解放,经济高速度增长,中国成为世界第二大经济体,实现第一次历史性的大变革.第二次是21世纪从 ...

  8. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

    题目描述 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参.输出已交换后的两个值. 输入 两个数,空格隔开 输出 交换后的两个数,空格隔开 样例输入 1 2 样例输出 2 ...

  9. 【Android RTMP】x264 图像数据编码 ( NV21 格式中的 YUV 数据排列 | Y 灰度数据拷贝 | U 色彩值数据拷贝 | V 饱和度数据拷贝 | 图像编码操作 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像数据中的 YUV 数据简介 二.向 x264 编码图片 三. 提取 NV21 数据中的灰度数据 Y 四. 提取 NV21 数据中的饱和度数据 U ...

最新文章

  1. 100G内存下,MySQL查询200G大表会OOM么?
  2. winform datagridview 重新绘制datagridview的边框。
  3. 【采用】规则引擎Pyke与PyClips对比研究报告(高大上啊,第一次听说pyke和pyclips这俩词~)
  4. 重磅发布!吴恩达 AI 完整课程资源超级大汇总!
  5. Fedora 10成功安装KDE4.2正式版
  6. ITK:过滤图像FilterImage
  7. CodeForces - 888G Xor-MST(贪心+字典树+最小生成树)
  8. 从东岳流体下载自带OpenFOAM的Vmware虚拟机(Ubuntu20.04+OpenFOAM),无法共享文件夹【终极解决方案】
  9. jquery中方法扩展 ($.fn $.extend) 学习笔记
  10. 使用浏览器地址栏调用CXF Webservice的写法
  11. 【sklearn第二十一讲】矩阵分解问题
  12. 栅栏密码怎么写java程序_栅栏密码
  13. win7怎么关uac_win7电脑如何关闭uac用户账户控制
  14. python语言count什么意思_python中count函数是什么意思?
  15. java高级软件工程师证书国家,看完这篇彻底明白了
  16. bzoj3654 图样图森破
  17. 差模、共模、奇模、偶模的区别与差异
  18. 基于深度学习的单视图三维重建算法学习路线
  19. 含论文基于JAVA的户籍信息管理系统【数据库设计、源码、开题报告】
  20. 多址接入技术 FDMA TDMA CDMA NOMA

热门文章

  1. 如何将excel里的数据批量导入ACCESS,要用vb代码?
  2. 全程快捷键!硬核小哥超快配图1700页数学笔记,教你上手LaTeX+Inkscape
  3. 百度云2019落地第一枪打响:两款智能边缘硬件,让城市环卫、农药喷洒都AI起来...
  4. 马斯克新梦想迈出第一步!首条地下高速隧道即将完工,12月免费体验
  5. 北大教授证明黎曼猜想?但在前一天取消了
  6. 2018网易未来科技峰会召开,科技新浪潮改变商业
  7. 纯新手入门机器/深度学习自学指南(附一个月速成方案)
  8. 原生JS实现简易转盘抽奖
  9. C++ String封装
  10. 判断并输出打印前一百个回文素数,每行10个