【Offer】[17] 【打印1到最大的n位数】

  • 题目描述
  • 思路分析
  • 测试用例
  • Java代码
  • 代码链接

题目描述

  输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。

思路分析

  1. 要考虑到大数问题,我们要求的n位数是否的整数,这里明显没有限制n的大小,我们可以用字符串来打印n位数
  2. 我们需要做两件事情:
    • 在字符串表达的数字上模拟+1 ,对字符串进行加一操作,注意停止加一的时机,即当最高位+1时,如果产生进位,则停止加1 ,比如:999+1
    • 打印字符串表示的n为数,打印字符数组形成的数字,注意当遇到不是'0'的时候才开始打印

测试用例

  1. 功能测试(输入1,2,3……)
  2. 特殊输入测试(输入0,-1)

Java代码

public class Offer17 {

    public static void main(String[] args) {
        System.out.println("功能测试--->");
        test1();
        System.out.println("特殊值测试--->");
        test2();
    }

    public static void print1ToMaxOfNDigits(int n) {
        Solution1(n);
    }

    /**
     * 用模拟加1 的方法
     *
     * @param n
     */
    private static void Solution1(int n) {
        if (n <= 0) {
            throw new IllegalArgumentException("参数非法");
        }
        char[] number = new char[n];
        Arrays.fill(number, '0');// 全部初始化为为'0'
        while (!increment(number)) {
            printCharNumber(number);
        }
    }

    /**
     * 对字符串进行加一操作,注意停止加一的时机,即当最高位+1时,如果产生进位,则停止加1 ,比如:999+1
     *
     * @param number
     * @return
     */
    private static boolean increment(char[] number) {
        boolean isOverflow = false; // 判断最高位是否产生进位,停止+1的条件
        int nTakeOver = 0; // 产生的进位
        // 数组从后往前遍历,数组后面的位表示数值的低位
        for (int i = number.length - 1; i >= 0; i--) {
            int nSum = (number[i] - '0') + nTakeOver;
            if (i == number.length - 1) {
                nSum++;
            }
            if (nSum >= 10) {
                if (i == 0) {// 最高位
                    isOverflow = true;
                } else {
                    nSum -= 10;
                    nTakeOver = 1;
                    number[i] = (char) ('0' + nSum);
                }
            } else {
                number[i] = (char) ('0' + nSum);
                break;
            }
        }
        return isOverflow;
    }

    /**
     * 打印字符数组形成的数字,注意当遇到不是'0'的时候才开始打印
     */
    private static void printCharNumber(char[] number) {
        boolean isBeginning0 = true;
        for (int i = 0; i < number.length; i++) {
            if (isBeginning0 && (number[i] - '0') != 0) {
                isBeginning0 = false;
            }
            if (!isBeginning0) {
                System.out.print(number[i]);
            }
        }
        System.out.println();
    }

    private static void test1() {
        System.out.println("2---->");
        print1ToMaxOfNDigits(2);
    }

    private static void test2() {
        System.out.println("-1---->");
        print1ToMaxOfNDigits(-1);
        System.out.println("0---->");
        print1ToMaxOfNDigits(0);
    }
}

代码链接

剑指Offer代码-Java

原文地址:https://www.cnblogs.com/haoworld/p/offer17-da-yin1dao-zui-da-den-wei-shu.html

时间: 2024-10-20 22:07:42

【Offer】[17] 【打印1到最大的n位数】的相关文章

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

【剑指offer】打印1到最大的n位数

题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数即999. 此题很容易误入陷阱! //第一次解法,不幸调入陷阱 void print(int n) { if (n<1) { printf("Invalid Input!\n"); return; } long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出 for (int i=0; i<maxNum; i++) { pri

LeetCode | 面试题17. 打印从1到最大的n位数【剑指Offer】【Python】

LeetCode 面试题17. 打印从1到最大的n位数[剑指Offer][Easy][Python][遍历] 问题 力扣 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 思路 Python3代码 class Solution: def printNumbers(self, n: int

面试题17:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. 解题思路: 首先是一个大陷阱,n有多大?万一大到long long类型都盛不下,你要直接动手写,那写的再正确也是凉凉. 我们考虑到用字符来表示数字,然后把字符打印出来就行了. 书上巴拉巴拉说了一种很复杂的方法,代码量大也比较繁琐,感兴趣的去参考资料看就行了. 这里直接介绍第二种简单的方法,其实打印出从1最大的n位十进制数,实际就是

剑指offer (20) 打印螺旋矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; int nRows = matrix.size(); if (nRows == 0) return result; int nCols = matrix.at(0).size()

《剑指offer》第十七题:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <cstdio> #include <memory> void PrintNumber(char* number); bool Increment(char* number); void Print1ToMaxOfNDigitsRecursively(char* number, int length

数据结构-打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 分析:本题最关键的部分是当n值非常大的时候会超出数据类型的范围.偷个懒,没有实现打印1,2,3....999.可以利用分割把string分割成char[].然后单个的char转为int再进行加减法,作为输出. /* 剑指offer面试题12 该问题主要考虑到数据非常大超出数据类型的范围 */ #include <iostream> #include <cstring>

【C语言】打印1到最大的n位数

//打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数.比如:输入3,则打印出1.2一直到最大的3位数999 #include <stdio.h> #include <stdlib.h> #include <memory.h> int num[10]; int add(int n) { int isoverflow = 0; int carry = 0; int i; for (i = 9; i >= 10 - n; i--) { num[

打印1到最大的n位数----java实现

题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999. 分析: 1.这是一个典型的大数加法问题,无论是int还是long long类型多无法表示.所以在解决大数问题时,通常是使用字符串或者数组实现其功能(由于个人比较钟爱数组,所以下面代码是使用数组实现的). 2.在大数的加法中,我们需要注意的问题是进位问题. 3.在该题中还需要判断是否为最大的n位整数.这里需要一个小技巧,我们只需判断最高位(第n位)是否要进位,如果需进