题目
题目链接:
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;
}
};