首页 > 试题广场 >

下一个更大的数(三)

[编程题]下一个更大的数(三)
  • 热度指数:619 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个正整数n ,请找出由该正整数各个数位组成的大于其本身的最小整数,成功找到将其返回,否则返回-1 。
注意答案在int范围内
示例1

输入

13

输出

31

说明

比13大的符合要求的最小整数为31  
示例2

输入

31

输出

-1

说明

没有比31大的符合要求的整数  
class Solution {
private:
    void nextPermutation(string& nums) {
        int length=nums.size();
        for (int i=length-1; i>=0; i--) {
            for (int j=length-1; j>i; j--) {
                if (nums[j]>nums[i]) {
                    swap(nums[j], nums[i]);
                    reverse(nums.begin()+i+1, nums.end());
                    return;
                }
            }
        }
        reverse(nums.begin(), nums.end());
    }
public:
    int nextGreaterElement(int n) {
        // write code here
        string nums=to_string(n);
//         next_permutation(nums.begin(), nums.end());
        nextPermutation(nums);
        long long temp=stol(nums);
        return temp>INT_MAX?-1:temp>n?temp:-1;
    }
};

发表于 2022-08-05 17:24:15 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    public int nextGreaterElement(int n) {
        // write code here
        String[] array = String.valueOf(n).split("");

        // 转int数组好操作
        int[] intArr = new int[array.length];
        for (int i = 0; i < intArr.length; i++) {
            intArr[i] = Integer.parseInt(array[i]);
        }

        // 先取最后一位,从后往前比较
        int index = intArr.length - 1;
        while (index > 0) {
            for (int i = index; i > 0; i--) {
                if (intArr[i - 1]==0){
                    // 跳过特殊值0
                    continue;
                }
                if (intArr[index] > intArr[i - 1]) {
                    swap(intArr, index, i - 1);
                    return transInt(intArr, i - 1);
                }
            }
            // 继续向前取一位
            index--;
        }

        return -1;
    }

    private int transInt(int[] intArr, int index) {
        // 把发生交换位之后的数字按升序排列,这样一定最小
        Arrays.sort(intArr, index + 1, intArr.length);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i <= intArr.length - 1; i++) {
            sb.append(intArr[i]);
        }

        // 防止溢出,先转Long试一试
        if (Long.parseLong(sb.toString()) > Integer.MAX_VALUE) {
            return -1;
        } else {
            return Integer.parseInt(sb.toString());
        }

    }

    // 交换两个元素
    private void swap(int[] intArr, int i, int i1) {
        int temp = intArr[i];
        intArr[i] = intArr[i1];
        intArr[i1] = temp;
    }
}

发表于 2022-04-12 22:24:47 回复(0)

问题信息

难度:
2条回答 1811浏览

热门推荐

通过挑战的用户

查看代码