列表

详情


NC324. 下一个更大的数(三)

描述

给定一个正整数n ,请找出由该正整数各个数位组成的大于其本身的最小整数,成功找到将其返回,否则返回-1 。
注意答案在int范围内

示例1

输入:

13

输出:

31

说明:

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

示例2

输入:

31

输出:

-1

说明:

没有比31大的符合要求的整数

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 436KB, 提交时间: 2022-03-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    int nextGreaterElement(int n) {
        // write code here
        string s = to_string(n);
        int len  = s.size();
        if(len<=1) return -1;
        int i = len -2;
        while(i>=0&&s[i]>=s[i+1]) i--;
        if(i<0) return -1;
        int j = len -1;
        while(j>=0&&s[j]<=s[i]) j--;
        swap(s[i],s[j]);
        reverse(s.begin()+i+1,s.end());
        long num = stol(s);
        return num>INT_MAX?-1:num;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 440KB, 提交时间: 2022-03-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    int nextGreaterElement(int n) {
        // write code here
        string strn = to_string(n);
        if (!std::next_permutation(strn.begin(), strn.end())) {
            return -1;
        }
            
//         printf("value:%s\n", strn.c_str());
        int num = atoi(strn.c_str());
        return num;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 416KB, 提交时间: 2022-07-13

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    int nextGreaterElement(int n) {
        // write code here
        string num_str = to_string(n);
        int i, j, m = num_str.size();
        char ch;
        if(m <= 1) return -1;
        for(i = m-2; i >= 0; i--){
            if(num_str[i] < num_str[i+1]) break;
        }
        if(i < 0) return -1;
        sort(num_str.begin()+i+1, num_str.end());
        cout <<i <<" "<<num_str<<endl;
        for(j = i; j < m; j++){
            if(num_str[i] < num_str[j]){
                ch = num_str[j];
                num_str[j] = num_str[i];
                num_str[i] = ch;
                cout <<j <<endl;
                break;
            }
        }
        cout << num_str;
        return stoi(num_str);
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 416KB, 提交时间: 2022-06-21

class Solution {
  public:
    int nextGreaterElement(int n) {
        string s = to_string(n);
        int h  = s.size();
        if (h <= 1)
            return -1;
        int i = h - 2;
        while (i >= 0 && s[i] >= s[i + 1]) i--;
        if (i < 0)
            return -1;
        int j = h - 1;
        
        while (j >= 0 && s[j] <= s[i]) j--;
        swap(s[i], s[j]);
        reverse(s.begin() + i + 1, s.end());
        long a = stol(s);
        return a > INT_MAX ? -1 : a;
    }
};

C 解法, 执行用时: 4ms, 内存消耗: 424KB, 提交时间: 2022-06-25

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int nextGreaterElement(int n) {
    int nums[20], numsLen = 0, v = n;
    while(v > 0) {
        nums[numsLen++] = v % 10;
        v = v / 10;
    }
    for (int i = 1; i < numsLen; i++) {
        if (nums[i] < nums[i-1]) {
            int left = 0, right = i-1, lastRight = i, mid;
            while(left <= right) {
                mid = (left + right) / 2;
                if (nums[mid] > nums[i]) {
                    lastRight = mid;
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            }
            int tmp = nums[i];
            nums[i] = nums[lastRight];
            nums[lastRight] = tmp;
            
            int len = i, halfLen = len / 2;
            for (int j = 0; j < halfLen; j++) {
                tmp = nums[j];
                nums[j] = nums[i-1-j];
                nums[i-1-j] = tmp;
            }
            
            len = numsLen;
            halfLen = len / 2;
            for (int j = 0; j < halfLen; j++) {
                tmp = nums[j];
                nums[j] = nums[numsLen - 1 - j];
                nums[numsLen - 1 - j] = tmp;
            }
            int sum = 0;
            for (int j = 0; j < numsLen; j++) {
                sum = sum * 10 + nums[j];
            }
            return sum;
        }
    }
    
    return -1;
}




上一题