1 2 3 4 5 全排列,现在给出一个数字如13245,能够得到比它大的最小的数字:13254,而比13254大的最小的数字是13425请问这个方法怎么写? 不要用递归得出全排列,然后排序,再indexOf()  get()这样的方法,有没有其它方法?

解决方案 »

  1.   

    to 1L:
    按你说的意思推理:
    25431  最后一位是1则和十位交换 得到25413 可是这个数并不比前面的数大啊15342 和离2最近的比2的数交换得到25341 这并不符合我的要求啊请你再确认下你没有理解错题目
      

  2.   

    好像可以这么做:
    把数字按位拆成数组 a0,a1,a2,a3,a4 
    for(i=4;i>0;i--){
    if(a[i]<a[i-1]){
    交换(a[i],a[i-1])
    break;
    }
    }
    数组重新组成数字返回
      

  3.   

    五个位置 五个数字,全排列每一个位置上最大为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、同理只是思路,楼主可以优化下
      

  4.   


    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;
    }
    }
    }}
      

  5.   


    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;
    }
    }
      

  6.   

    very  good   终于见识到了csdn上牛人的存在
      

  7.   

    呵呵,,终于把另一题解决了, 里面借用了各位的思想或代码。
    具体见:
    http://topic.csdn.net/u/20110304/22/708bfaef-8407-4011-9e8d-2509839539fa.html?seed=114888749&r=72004051#r_72004051如果大家有更好的方法请分享下啊