关于数字排列问题 1 2 3 4 5 全排列,现在给出一个数字如13245,能够得到比它大的最小的数字:13254,而比13254大的最小的数字是13425请问这个方法怎么写? 不要用递归得出全排列,然后排序,再indexOf() get()这样的方法,有没有其它方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to 1L:按你说的意思推理:25431 最后一位是1则和十位交换 得到25413 可是这个数并不比前面的数大啊15342 和离2最近的比2的数交换得到25341 这并不符合我的要求啊请你再确认下你没有理解错题目 好像可以这么做:把数字按位拆成数组 a0,a1,a2,a3,a4 for(i=4;i>0;i--){if(a[i]<a[i-1]){交换(a[i],a[i-1])break;}}数组重新组成数字返回 五个位置 五个数字,全排列每一个位置上最大为1,最小为5对于数字:abcde 求比它大的最小数字?1、首先,将abcde分为 abc de两部分,对d、e按升序排序,如果d最大则看步骤2;否则,将d、e交换即可得到解;2、将abcde分为 ab cde两部分,对c、d、e按升序排序,如果c是最大则看步骤3;否则,将比c稍大那个数字放在c的位置上,另两个数字按升序排在后面;3、同理只是思路,楼主可以优化下 import java.util.Arrays;public class ButtonEvent { public static void main(String[] args) { int num = 14532; String temp = "" + num; int count = 5; for (int i = 2; i < count; i++) { String aa = temp.substring(count - i);// 取后边的i位,2,3,4 System.out.println("-->"+aa); String a = aa.substring(0, 1);// 最i位的第一位,用来判断它是不是最后三位中最大的, //如果是最大的,那么就是无法再找一个比它大的,只能是进位 //去比较了 char c[] = aa.toCharArray();// 用来排序 Arrays.sort(c); String sorts = new String(c); System.out.println("-->"+sorts); int index = sorts.indexOf(a);//查找所在的位置,如果是最后,则是最大的,要进位比较了 if(index!=(i-1))//如果不是最大的,则拿它后一位变到第一位,其他的连起来的,因为是排序过的 //这样的结果就是在这i位中最小的了 { //组装i位,比i位大的最小值 String str1=sorts.substring(index+1,index+2);//最高位 System.out.println(str1); String str2=sorts.substring(0,index+1);//前面的 System.out.println(str2); String str3=sorts.substring(index+2);//后面的 System.out.println(str3); System.out.println("结果:"+temp.substring(0,count-i)+str1+str2+str3); break; } } }} public static int getBiggerNumberWithSameGean(int number){ List<Integer> list = new LinkedList<Integer>(); while(number > 0){ list.add(number % 10); number /= 10; } Integer[] gean = new Integer[list.size()]; list.toArray(gean); int index = 0; //从个位开始往高位找到最大升序子序列,index 位为需要替换的 while(index < gean.length - 1 && gean[index] <= gean[index++ + 1]); if(index == gean.length - 1) //本数已为最大 return number; else{ int rear = index; int head = 0; //找到最大升序子序列中最小的且比index大的数字 while(--index >= 0 && gean[index] > gean[rear]); //将本数字与index位交换 gean[++index] ^= gean[rear]; gean[rear] ^= gean[index]; gean[index] ^= gean[rear--]; //将最大升序子序列逆转 while(head < rear){ gean[head] ^= gean[rear]; gean[rear] ^= gean[head]; gean[head++] ^= gean[rear--]; } int result = 0; for (int i = 0; i < gean.length; i++) { result = result * 10 + gean[gean.length - i - 1]; } return result; } } very good 终于见识到了csdn上牛人的存在 呵呵,,终于把另一题解决了, 里面借用了各位的思想或代码。具体见:http://topic.csdn.net/u/20110304/22/708bfaef-8407-4011-9e8d-2509839539fa.html?seed=114888749&r=72004051#r_72004051如果大家有更好的方法请分享下啊 怎样将父类范型集合转为子类范型集合 java 运行时问题 Java的这个输入流的问题怎么解决 关于嵌套类 请教! 请达人指教: Java与C++在对象数组初始化上的区别 为什么我的JB7在Wizards下生成jar或是其他什么东西,都没反映? 请教一下关与JDK的一些知识 请问哪有corejava2配套光盘的源代码的下载?能下载立刻给分! CMP里面怎样处理自动增长的字段?怎样取回某字段的最大值? 列举1 2 3组成数字的所有组合 JUnit 对DAO数据存储问题?
按你说的意思推理:
25431 最后一位是1则和十位交换 得到25413 可是这个数并不比前面的数大啊15342 和离2最近的比2的数交换得到25341 这并不符合我的要求啊请你再确认下你没有理解错题目
把数字按位拆成数组 a0,a1,a2,a3,a4
for(i=4;i>0;i--){
if(a[i]<a[i-1]){
交换(a[i],a[i-1])
break;
}
}
数组重新组成数字返回
对于数字:abcde 求比它大的最小数字?
1、首先,将abcde分为 abc de两部分,对d、e按升序排序,如果d最大则看步骤2;否则,将d、e交换即可得到解;
2、将abcde分为 ab cde两部分,对c、d、e按升序排序,如果c是最大则看步骤3;否则,将比c稍大那个数字放在c的位置上,另两个数字按升序排在后面;
3、同理只是思路,楼主可以优化下
import java.util.Arrays;public class ButtonEvent {
public static void main(String[] args) {
int num = 14532;
String temp = "" + num;
int count = 5;
for (int i = 2; i < count; i++) {
String aa = temp.substring(count - i);// 取后边的i位,2,3,4
System.out.println("-->"+aa);
String a = aa.substring(0, 1);// 最i位的第一位,用来判断它是不是最后三位中最大的,
//如果是最大的,那么就是无法再找一个比它大的,只能是进位
//去比较了
char c[] = aa.toCharArray();// 用来排序
Arrays.sort(c);
String sorts = new String(c);
System.out.println("-->"+sorts);
int index = sorts.indexOf(a);//查找所在的位置,如果是最后,则是最大的,要进位比较了
if(index!=(i-1))//如果不是最大的,则拿它后一位变到第一位,其他的连起来的,因为是排序过的
//这样的结果就是在这i位中最小的了
{
//组装i位,比i位大的最小值
String str1=sorts.substring(index+1,index+2);//最高位
System.out.println(str1);
String str2=sorts.substring(0,index+1);//前面的
System.out.println(str2);
String str3=sorts.substring(index+2);//后面的
System.out.println(str3);
System.out.println("结果:"+temp.substring(0,count-i)+str1+str2+str3);
break;
}
}
}}
public static int getBiggerNumberWithSameGean(int number){
List<Integer> list = new LinkedList<Integer>();
while(number > 0){
list.add(number % 10);
number /= 10;
}
Integer[] gean = new Integer[list.size()];
list.toArray(gean);
int index = 0;
//从个位开始往高位找到最大升序子序列,index 位为需要替换的
while(index < gean.length - 1 && gean[index] <= gean[index++ + 1]);
if(index == gean.length - 1) //本数已为最大
return number;
else{
int rear = index;
int head = 0;
//找到最大升序子序列中最小的且比index大的数字
while(--index >= 0 && gean[index] > gean[rear]);
//将本数字与index位交换
gean[++index] ^= gean[rear];
gean[rear] ^= gean[index];
gean[index] ^= gean[rear--];
//将最大升序子序列逆转
while(head < rear){
gean[head] ^= gean[rear];
gean[rear] ^= gean[head];
gean[head++] ^= gean[rear--];
}
int result = 0;
for (int i = 0; i < gean.length; i++) {
result = result * 10 + gean[gean.length - i - 1];
}
return result;
}
}
具体见:
http://topic.csdn.net/u/20110304/22/708bfaef-8407-4011-9e8d-2509839539fa.html?seed=114888749&r=72004051#r_72004051如果大家有更好的方法请分享下啊