zoukankan      html  css  js  c++  java
  • 剑指Offer之打印从1到最大的n位数

    基本思路

      第一种方法:当我们只有对9999或者999或者99或9加1的时候,才会在第一个数字的基础上产生进位,而其他所有情况都不好在第一个数字上产生进位。因此当我们发现在加1的时候第一个数字产生了进位,则已经是最大的n位数,此时increment返回true,循环终止。代码如下:

    public class Print1ToMaxOfDigits {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            while (sc.hasNext()) {
                int n = sc.nextInt();
                int[] number = new int[n];
                while (!increment(number)) {
                    printNumber(number);
                }
                //printMaxOfNdigits2(n);
    
            }
        }
     /**
         * 这个方法是用来实现对数加1操作
         *
         * @param number
         * @return
         */
        public static boolean increment(int[] number) {
            boolean isOverflow = false;//是否有进位
            int nTakeOver = 0;
            int nLength = number.length;
            for (int i = nLength - 1; i >= 0; i--) {
                int nSum = number[i] + nTakeOver;
                if (i == nLength - 1) {
                    nSum++;
                }
                if (nSum >= 10) {
                    if (i == 0) {
                        isOverflow = true;
                    } else {
                        nTakeOver = 1;
                        nSum = nSum - 10;
                        number[i] = nSum;
                    }
                } else {
                    number[i] = nSum;
                    break;
                }
            }
            return isOverflow;
        }
    
        /**
         * 该方法是负责打印
         *
         * @param number
         */
        public static void printNumber(int[] number) {
            boolean isBegining = true;
            for (int i = 0; i < number.length; i++) {
                if (isBegining && number[i] != 0) {
                    isBegining = false;
                }
                if (!isBegining) {
                    System.out.print(number[i]);
                }
            }
        }
    }

      第二种方法:使用全排列,数字的每一位都可能是0~9中的一个数,然后设置下一位。递归结束的条件是我们已经设置了数字的最后一位。代码如下:

    public class Print1ToMaxOfDigits {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            while (sc.hasNext()) {
                int n = sc.nextInt();
                int[] number = new int[n];
    //            while (!increment(number)) {
    //                printNumber(number);
    //            }
                printMaxOfNdigits2(n);
    
            }
        }
    
    /**
         * 全排序列实现
         *
         * @param number
         * @param length
         * @param index
         */
        public static void printMaxOfNdigitsRecursively(int[] number, int length, int index) {
            if (index == length - 1) {
                printNumber(number);
                return;
            }
            for (int i = 0; i < 10; i++) {
                number[index + 1] = i;
                printMaxOfNdigitsRecursively(number, length, index + 1);
            }
        }
    
        public static void printMaxOfNdigits2(int n) {
            if (n <= 0)
                return;
            int[] number = new int[n];
            for (int i = 0; i < 10; i++) {
                number[0] = i;
                printMaxOfNdigitsRecursively(number, n, 0);
            }
        }
    }
  • 相关阅读:
    css文本溢出省略号
    SQL语句判断是否为今天或昨天
    git 常用命令
    SwitchHosts—hosts管理利器
    ORACLE ERP consolidation流程(一)
    R12 AR INVOICE 接口表导入
    FA模块的10个API范例
    使用dbms_profiler包测试存储过程性能
    WebADI应用到Office 2016 64-bit
    Oracle EBS主界面的Top Ten List
  • 原文地址:https://www.cnblogs.com/lfeng1205/p/6819701.html
Copyright © 2011-2022 走看看