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);
            }
        }
    }
  • 相关阅读:
    你知道吗,Flutter内置了10多种show
    强大的Flutter App升级功能
    Flutter 日期时间DatePicker控件及国际化
    你知道吗,Flutter内置了10多种Button控件
    Flutter Form表单控件超全总结
    Flutter 裁剪类组件 最全总结
    Flutter 拖拽控件Draggable看这一篇就够了
    Python 浮点数的冷知识
    Python 为了提升性能,竟运用了共享经济
    Python 之父的解析器系列之六:给 PEG 语法添加动作
  • 原文地址:https://www.cnblogs.com/lfeng1205/p/6819701.html
Copyright © 2011-2022 走看看