• 556. 下一个更大元素 III


    556. 下一个更大元素 III

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

    • 示例 1:
      输入: 12
      输出: 21
    • 示例 2:
      输入: 21
      输出: -1

    代码

    class Solution {
        public int nextGreaterElement(int n) {
            int[] array = transfer(n);
            /*
            求出的下一个全排列可能会超出int类型的范围
            这并不符合得出的答案是32位的结果
            所以我将结果用long保存
            如果它超出了int的表示范围
            就返回-1
            */
            long result = nextArray(array);
            if (result > Integer.MAX_VALUE) {
                return -1;
            }
            return (int)result;
            //return nextArray(array);
        }
    
        public long nextArray(int[] array) {
            int length = array.length;
    
            /*
             * 第一步,寻找最后一个正序
             * 寻找方法 : 从后向前找
             */
            int i;
            for (i = length-1; i > 0 ; i--) {
                if (array[i-1] < array[i]) {
                    break;
                }
            }
            /*
             * 如果没找到,也就是到了最后的一个
             */
            if (i == 0) {
                return -1;
            }
    
            /*
             *第二步,从后往前找一个比array[i-1]大的第一个数字.
             */
            int j;
            for (j = length-1; j > i; j --) {
                if (array[j] > array[i-1]) {
                    break;
                }
            }
    
            /*
            第三步,交换array[i-1],array[j]
             */
            int temp = array[i-1];
            array[i-1] = array[j];
            array[j] = temp;
    
            /*
            最后一步,把i-1后面(从i-2开始至length-1)的序列反序
             */
            while (i < length-1) {
                temp = array[i];
                array[i] = array[length-1];
                array[length-1] = temp;
    
                i ++;
                length --;
            }
            /*
            反序完毕即为一次排列结束
            得到的序列就是下一个全排列
             */
    
            long result = 0;
            for (int index = 0; index < array.length; index++) {
                result *= 10;
                result += array[index];
            }
    
            return result;
        }
    
        private int[] transfer(int n) {
            String str = Integer.toString(n);
            int[] arr = new int[str.length()];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
            }
            return arr;
        }
    }
  • 相关阅读:
    VSTO资源
    Windows Server 2008启用无线网络服务支持(转)
    [转载]数据库设计三大范式应用实例剖析
    C#如何为winform程序打包发布应用(图解)
    XPO学习一(获取数据库服务器时间)
    php中echo和print的区别
    isset()
    asp.net文本编辑器FCKeditor详解
    ASP.net 上传大文件问题
    StringBuilder与string和String的区别
  • 原文地址:https://www.cnblogs.com/hh09cnblogs/p/11632646.html
Copyright © 2020-2023  润新知