字典序算法

2018-04-09  本文已影响35人  朱Simon
题目:给定一个正整数,实现一个方法来求出离该整数最近的大于自身的“换位数”。

换位数:把一个整数各个数位的数字进行全排列,从而得到新的整数。

/**
 * Copyright (C), 2015-2018, XXX有限公司
 * FileName: Main
 * Author:   simonzhu
 * Date:     2018/4/9 下午5:21
 * Description: Just for ceshi
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */

import java.util.Arrays;
import java.util.Scanner;

/**
 * 〈一句话功能简述〉<br>
 * 〈Just for ceshi〉
 *
 * @author simonzhu
 * @create 2018/4/9
 * @since 1.0.0
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入你需要转换的数:");
        while (scanner.hasNext()){
            System.out.println("获取到的换位数为:");
            String[] numsStr = scanner.nextLine().split("");
            int[]nums = new int[numsStr.length];
            for (int i = 0,len=nums.length; i <len ; i++) {
                nums[i]=Integer.valueOf(numsStr[i]);
            }
            System.out.println(Arrays.toString(getHuanWeiNum(nums)));
            System.out.println("输入你需要转换的数:");
        }
    }

    private static int[] getHuanWeiNum(int[] nums) {
        int no=getNo(nums);
        if (no==0){
            return nums;
        }
        exchangeNum(nums,no-1);
        reserveNum(nums,no-1);
        return nums;
    }

    private static int[] reserveNum(int[] nums, int no) {
        for (int i = no+1,len=nums.length,j=len-1,temp; i<j; i++,j--) {
            temp=nums[i];
            nums[i]=nums[j];
            nums[j]=temp;
        }
        return nums;
    }

    private static int[] exchangeNum(int[] nums, int no) {
        for (int len=nums.length,i=len-1,temp; i >0; i--) {
            if (nums[no]<nums[i]){
                temp=nums[no];
                nums[no]=nums[i];
                nums[i]=temp;
                return nums;
            }
        }
        return  nums;
    }

    private static int getNo(int[] nums) {
        for (int len=nums.length,i=len-1; i >0; i--) {
            if(nums[i]>nums[i-1]){
                return i;
            }
        }
        return 0;
    }

}

注:以上解法出自微信公众号《程序员小灰》中2018.04.09发布的《漫画:什么是字典序算法?》一文

上一篇 下一篇

猜你喜欢

热点阅读