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
原始数据
按行查看
历史