zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    牛客网在线编程:不要二
    牛客网在线编程:素数对
    剑指offer5:用两个栈实现队列
    剑指offer4:重建二叉树
    剑指offer3:从尾到头打印链表
    剑指offer2:替换空格
    剑指offer1:二维数组中的查找
    牛客网在线编程:藏宝图
    已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序
    回文函数的编写
  • 原文地址:https://www.cnblogs.com/hh09cnblogs/p/11632646.html
Copyright © 2011-2022 走看看