牛客NC324 下一个更大的数(三)【中等 双指针 Java/Go/PHP/C++】参考lintcode 52 · 下一个排列

题目

题目链接:

https://www.nowcoder.com/practice/475da0d4e37a481bacf9a09b5a059199

思路

第一步:获取数字上每一个数,组成数组arr
第二步:利用"下一个排列" 问题解题方法来继续作答,步骤:
    利用lintcode 52 下一个排列的解放方法
   从后往前找,找到第一对(i,j),i<j,使得 nums[i] < num[j] ,
   然后将两者交换后,后面部分排序即可。

Java代码

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return int整型
     */
    public int nextGreaterElement (int n) {
        //lintcode上类似的同一个道题52 · 下一个排列
        List<Integer> ll = new ArrayList<>();
        while (n > 0) {
            int mod = n % 10;
            n = n / 10;
            ll.add(mod);
        }

        int size = ll.size();
        int[] arr = new int[size];
        for (int i = 0; i < size ; i++) {
            arr[i] = ll.get(size - i - 1);
        }

        //利用lintcode 52 下一个排列的解放方法
        //从后往前找,找到第一对(i,j),i<j,使得 nums[i] < num[j] ,
        //然后将两者交换后,后面部分排序即可。
        for (int i = size - 1; i >= 0 ; i--) {
            for (int j = size - 1; j > i ; j--) {
                if (arr[i] < arr[j]) {
                    int t = arr[i];
                    arr[i] = arr[j];
                    arr[j] = t;
                    Arrays.sort(arr, i + 1, size);

                    String s = "";
                    for (int i1 : arr) {
                        s += i1;
                    }
                    //这个位置lintcode52是return arr
                    return Integer.valueOf(s);
                }
            }
        }

        return -1; //这个位置lintcode52是return 排序后的arr
    }
}

Go代码

go 复制代码
package main

import "sort"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param n int整型
 * @return int整型
 */
func nextGreaterElement(n int) int {
	//类似的题目是lintcode 52下一个排列
	ll := []int{}
	for n > 0 {
		mod := n % 10
		n = n / 10
		ll = append(ll, mod)
	}

	size := len(ll)
	arr := make([]int, size)
	for i := 0; i < size; i++ {
		arr[i] = ll[size-i-1]
	}

	//利用lintcode 52 下一个排列的解放方法
	//从后往前找,找到第一对(i,j),i<j,使得 nums[i] < num[j] ,
	//然后将两者交换后,后面部分排序即可。
	for i := size - 1; i >= 0; i-- {
		for j := size - 1; j > i; j-- {
			if arr[i] < arr[j] {
				t := arr[i]
				arr[i] = arr[j]
				arr[j] = t
				arr1 := []int{}
				if i+1 < size {
					for k := i + 1; k < size; k++ {
						arr1 = append(arr1, arr[k])
					}
				}
				sort.Ints(arr1) //对i+1开始到最后的数字进行排序

				ans := 0
				for k := 0; k <= i; k++ {
					ans = ans*10 + arr[k]
				}
				for k := 0; k < len(arr1); k++ {
					ans = ans*10 + arr1[k]
				}

				return ans
			}
		}
	}

	return -1
}

PHP代码

php 复制代码
<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @return int整型
 */
function nextGreaterElement( $n )
{
     //类似的同一道题是lintcode 52 下一个排列
    $arr = [];
    while ($n >0){
        $mod = $n%10;
        $n =intval($n/10);
        array_unshift($arr,$mod);
    }

    //利用lintcode 52 下一个排列的解放方法
    //从后往前找,找到第一对(i,j),i<j,使得 nums[i] < num[j] ,
    //然后将两者交换后,后面部分排序即可。
    $size = count($arr);
    for($i=$size-1;$i>=0;$i--){
        for($j=$size-1;$j>$i;$j--){
            if($arr[$i] < $arr[$j]){
                $t = $arr[$i];
                $arr[$i] = $arr[$j];
                $arr[$j]= $t;

                $arr1 = [];
                for($k=$i+1;$k<$size;$k++){
                    array_push($arr1,$arr[$k]);
                }
                sort($arr1); //对i+1到size位置的数排序

                $ans = 0;
                for($k=0;$k<=$i;$k++){
                    $ans = $ans*10+$arr[$k];
                }

                for($k=0;$k<count($arr1);$k++){
                    $ans =$ans*10+$arr1[$k];
                }

                return $ans;
            }
        }
    }

    return -1;
}

C++代码

cpp 复制代码
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return int整型
     */
    int nextGreaterElement(int n) {
        vector<int> ll;
        while (n > 0) {
            ll.push_back(n % 10);
            n = n / 10;
        }

        int size = ll.size();
        vector<int> arr(size);
        for (int i = 0; i < size; i++) {
            arr[i] = ll[size - i - 1];
        }
        //利用lintcode 52 下一个排列的解放方法
        //从后往前找,找到第一对(i,j),i<j,使得 nums[i] < num[j] ,
        //然后将两者交换后,后面部分排序即可。
        for (int i = size - 1; i >= 0; i--) {
            for (int j = size - 1; j > i; j--) {
                if (arr[i] < arr[j]) {
                    int t = arr[i];
                    arr[i] = arr[j];
                    arr[j] = t;

                    std::sort(arr.begin() + i + 1, arr.end()); //对i+1到size位置的数排序

                    int ans = 0;

                    for (int k = 0; k < size; k++) {
                        ans = ans * 10 + arr[k];
                    }
                    return ans;
                }
            }
        }
        return -1;
    }
};
相关推荐
清梦20201 小时前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
Altair澳汰尔2 小时前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
A懿轩A2 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
Python机器学习AI2 小时前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
吕小明么3 小时前
OpenAI o3 “震撼” 发布后回归技术本身的审视与进一步思考
人工智能·深度学习·算法·aigc·agi
1 9 J3 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
程序员shen1616113 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
汝即来归3 小时前
选择排序和冒泡排序;MySQL架构
数据结构·算法·排序算法
咒法师无翅鱼4 小时前
【定理证明工具调研】Coq, Isabelle and Lean.
算法