如果 一用户输入 1357 我要得到比当前用户用输入的这个数大的下一个数字(也就是1375 下一个则是1537 1573 3157 3175) 怎么写这个程序。声明一下。不要先把用户输入的数字拆解(1 3 5 7)然后组合(如 1357 1375 1537 1573)考虑效率
看那位高手能帮一下小弟。。

解决方案 »

  1.   

    一楼的 ChDw  我同意你的观点我想到了这种方法。。但是我不知道从何入手。。能不能麻烦你写一下啊。。真的,我当时看到这个题 的时候 我想到两中方法,但是你的这种方法我还没有证实,我在写的时候不知道从何入手。。麻烦了。。一定要考虑效率!
      

  2.   

    算法很简单啊,也只是一个循环罢了。String str = "19876";
    char[] array = str.toCharArray();
    int i = array.length - 2;
    while(i >= 0) {
    if(array[i] < array[i + 1]) {
    char tmp = array[i];
    array[i] = array[array.length - 1];
    array[array.length - 1] = tmp;
    int z = (i + array.length) / 2;
    for(int j = i + 1, k = array.length - 1; j <= z; j++, k--) {
    tmp = array[j];
    array[j] = array[k];
    array[k] = tmp;
    }
    }
    i--;
    }
    if(i < 0)
    throw new IllegalArgumentException("No More");
    System.out.println(new String(array));
      

  3.   

    啊,少了一个break了String str = "27419";
    char[] array = str.toCharArray();
    int i = array.length - 2;
    while(i >= 0) {
    if(array[i] < array[i + 1]) {
    char tmp = array[i];
    array[i] = array[array.length - 1];
    array[array.length - 1] = tmp;
    int z = (i + array.length) / 2;
    for(int j = i + 1, k = array.length - 1; j <= z; j++, k--) {
    tmp = array[j];
    array[j] = array[k];
    array[k] = tmp;
    }
    break;
    }
    i--;
    }
    if(i < 0)
    throw new IllegalArgumentException("No More");
    System.out.println(new String(array));
      

  4.   

    对了  ChDw  
    我想 我想问一下 里面for的上一行开始我不太理解 意思 ,能说说么。。我看了看没有看懂。不好意思。
    小弟,才疏学浅。。呵呵
      

  5.   

    for上一行是计算要变换顺序的中点,即198765432 变换一次后得到298765431,然后计算6这个数字所在的位,然后开始9与1交换、8与3交换,7与4交换,6与5交换,然后j超过了z值,不再进行移动,其实也可以不计算z,改成j < k就可以