字典序算法

題目:給定一個(gè)正整數(shù),實(shí)現(xiàn)一個(gè)方法來(lái)求出離該整數(shù)最近的大于自身的“換位數(shù)”。

換位數(shù):把一個(gè)整數(shù)各個(gè)數(shù)位的數(shù)字進(jìn)行全排列,從而得到新的整數(shù)。

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

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

/**
 * 〈一句話功能簡(jiǎn)述〉<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("輸入你需要轉(zhuǎn)換的數(shù):");
        while (scanner.hasNext()){
            System.out.println("獲取到的換位數(shù)為:");
            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("輸入你需要轉(zhuǎn)換的數(shù):");
        }
    }

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

}

注:以上解法出自微信公眾號(hào)《程序員小灰》中2018.04.09發(fā)布的《漫畫(huà):什么是字典序算法?》一文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一章數(shù)和數(shù)的運(yùn)算 一概念 (一)整數(shù) 1整數(shù)的意義 自然數(shù)和0都是整數(shù)。 2自然數(shù) 我們?cè)跀?shù)物體的時(shí)候,用來(lái)表示...
    meychang閱讀 2,844評(píng)論 0 5
  • leetcode刷題記錄本文記錄一下leetcode刷題記錄,記錄一下自己的解法和心得。 LeetCode Two...
    EarthChen閱讀 3,603評(píng)論 0 6
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-code.h...
    eddy_wiki閱讀 9,449評(píng)論 0 30
  • 1、用C語(yǔ)言實(shí)現(xiàn)一個(gè)revert函數(shù),它的功能是將輸入的字符串在原串上倒序后返回。 2、用C語(yǔ)言實(shí)現(xiàn)函數(shù)void ...
    希崽家的小哲閱讀 6,691評(píng)論 0 12
  • 桑桑木閱讀 222評(píng)論 0 0

友情鏈接更多精彩內(nèi)容