题目要求

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 n 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位的正整数,要求找到用该正整数中同样的数字组成的比该正整数大的最小正整数。
比如现有正整数245,比该正整数大的数字包括425,452,254,542,524, 该方法应当返回254

思路和代码

有一个基本的思路我们知道,如果要找到大于当前数字的最小正整数,我们应当尽可能的保证高位不发生变化,通过交换低位的数字得到相对而言更大的正整数。

因此从右往左遍历,一旦找到一个数字,其值低于已经遍历过的任何一个值,则可以将从该值起右侧的所有数字的顺序进行调整,找到一个大于该子整数的最小正整数。

举个例子:53421,从右往左遍历可以3小于其右侧的任何一个值,则将3和右侧最小的整数进行交换得到51423,再对1右侧的所有数字按照从小到大进行排序,则可以得出大于53421的最小正整数,即51234

代码如下:

public int nextGreaterElement(int n) {  
    String value = String.valueOf(n);  
    char[] digits = value.toCharArray();  
    int i = digits.length - 1;  
    //找到小于右侧任意值的第一个正整数
    while (i > 0) {  
        if (digits[i - 1] < digits[i]) {  
            break;  
        }  
        i--;  
    }  
    
    if (i == 0) {  
        return -1;  
    }  
  
    //找到该整数右侧大于该整数的最小整数
    int maxIndex = i, j = i;  
    while (j < digits.length) {  
        if (digits[j] <= digits[maxIndex] && digits[j] > digits[i-1]) {  
            maxIndex = j;  
        }  
        j++;  
    }  
  
    //交换两个整数
    char tmp = digits[i-1];  
    digits[i-1] = digits[maxIndex];  
    digits[maxIndex] = tmp;  
  
    //对整数右侧的值按照从小到大进行排序
    Arrays.sort(digits, i, digits.length);  
  
    long result = Long.valueOf(String.valueOf(digits));  
    return result < Integer.MAX_VALUE ? (int) result : -1;  
}

raledong
2.7k 声望2k 粉丝

心怀远方,负重前行