牛客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;
    }
};
相关推荐
杨连江4 分钟前
原子级平面限域协同晶核诱导定向生长单层鳞片石墨的研究
算法
MATLAB代码顾问10 分钟前
混合粒子群-模拟退火算法(HPSO-SA)求解作业车间调度问题——附MATLAB代码
算法·matlab·模拟退火算法
Felven14 分钟前
C. Prefix Min and Suffix Max
算法
加农炮手Jinx14 分钟前
LeetCode 26. Remove Duplicates from Sorted Array 题解
算法·leetcode·力扣
加农炮手Jinx15 分钟前
LeetCode 88. Merge Sorted Array 题解
算法·leetcode·力扣
格林威15 分钟前
线阵工业相机:如何计算线阵相机的行频(Line Rate)?公式+实例
开发语言·人工智能·数码相机·算法·计算机视觉·工业相机·线阵相机
yueyue54318 分钟前
透过现象看本质:以fast_lio架构的整套算法的局部避障改为TEB算法为例深度探讨——如何成为一个合格的算法架构师?
算法·架构
梨花爱跨境18 分钟前
红人视频×A10算法:亚马逊转化率与流量闭环实战
算法
阿Y加油吧22 分钟前
二刷 LeetCode:75. 颜色分类 & 31. 下一个排列 复盘笔记
笔记·算法·leetcode
风筝在晴天搁浅24 分钟前
LeetCode 378.有序矩阵中第K小的元素
算法·矩阵