java下一个大的数_下一位数大.java

本文介绍了一个算法问题,即给定一个自然数,如何找到比它大的下一个自然数的排列,并提供了一个Java实现示例,该算法的时间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package javaji;

import java.util.Arrays;

public class ggg {

public static void main(String[] args) {

//1.给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度O(n)。例如:

//         给定1233,它的下一个是1323;

//         给定1323,它的下一个是1332;

//         给定9876,它的下一个不存在;

//         请设计一个函数,完成此功能。(语言不限)

String s = "124152342";

String ti2 = ti2(s);

System.out.println(ti2);

}

public static String ti2(String s) {

char[] chars = s.toCharArray();

if(s.length() == 1 || s.length() == 0) {

return "不存在";

}

if(s.length() == 2 && (chars[1] > chars[0])) {

swap(chars,0,1);

return new String(chars);

}

for (int i = 0; i < s.length()-1; i++) {

char a = s.charAt(s.length()-i-1);

char b = s.charAt(s.length()-i-2);

if(a > b) {//32432

String aa = s.substring(s.length()-i-1);//32

char[] aachar = aa.toCharArray();

char min2 = min(aachar);//2

System.out.println("min2:"+min2);

//复杂的

if(i == s.length() - 2) {//3421

char cc1 = s.charAt(0);//3

char cc2 = s.charAt(1);//4

String e = s.substring(1);

char[] c = e.toCharArray();//21

char min = min(c);//1

while(cc1 >= min) {

e = e.replace(min+"", ""); //2

char[] replace = e.toCharArray();

min = min(replace); //2

if("".endsWith(e)) {

break;

}

}

int minIndex = s.indexOf(min);

swap(chars,0,minIndex);

String ss = new String(chars);

//新的sss

char[] charArray = ss.substring(1).toCharArray();

Arrays.sort(charArray);

String sss = ss.charAt(0)+ new String(charArray);

return sss;

}

//特殊

if(b <= min2 && min2 < a) {

if(min2 == b || min2 == a) {//2==2

String replace = aa.replace(min2+"", "");//3

min2 = min(replace.toCharArray());//3

System.out.println("min3:"+min2);

}

String substring1 = s.substring(0,s.length()-i-2);//3

String substring = s.substring(s.length()-i-2);//2432

System.out.println("substring:"+substring);

char[] charArray = substring.toCharArray();

swap(charArray, 0, substring.indexOf(min2));

String string = new String(charArray);//3422

System.out.println("string:"+string);

//

char[] x1 = string.substring(1).toCharArray();

Arrays.sort(x1);

String xx= string.substring(0,1) + new String(x1);

System.out.println("x1:"+xx);

return substring1+xx;

}

//特殊2

if(b > min2) {//2341 2413 2431

swap(chars,s.length()-i-1 , s.length()-i-2);

String z1 = new String(chars).substring(0,s.length()-i-1);

String z = new String(chars).substring(s.length()-i-1);

char[] charArray = z.toCharArray();

Arrays.sort(charArray);

String zz = z1 + new String(charArray);

return zz;

}

swap(chars,s.length()-i-1 , s.length()-i-2);

return new String(chars);

}

}

return "不存在";

}

//交换

public static void swap(char[] chars,int a,int b){

char temp = chars[a];

chars[a]=chars[b];

chars[b]=temp;

}

//求最小值方法

public static char min(char[] arr) {

char min = arr[0];

for (int i = 1; i < arr.length; i++) {

if (min > arr[i]) {//对遍历的值进行比较,如果min中的值大于数组中的元素

//则min记住最小的

min = arr[i];

}

}

return min;

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值