题目描述

  输入数字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

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

  1. 剑指 Offer 17. 打印从1到最大的n位数

    剑指 Offer 17. 打印从1到最大的n位数 Offer 17 题目解析: 暴力解法 package com.walegarrett.offer; /** * @Author WaleGarret ...

  2. 力扣 - 剑指 Offer 17. 打印从1到最大的n位数

    题目 剑指 Offer 17. 打印从1到最大的n位数 思路1 如果有n位,那么最大值就是\(10^n-1\),即如果n是2,那么最大就到输出到99 考虑到大数情况,所以使用字符数组 还要把字符数组转 ...

  3. 【Java】 剑指offer(16) 打印1到最大的n位数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印 ...

  4. [LeetCode]剑指 Offer 17. 打印从1到最大的n位数

    输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7, ...

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

    题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到 ...

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

    题目描写叙述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比方输入3,则打印出1.2.3一直到最大的3位数即999. 分析描写叙述: 首先想到的是先计算出最大的n位数是多少,然后用一个循环从1 ...

  7. 【剑指offer】面试题 17. 打印从 1 到最大的 n 位数

    面试题 17. 打印从 1 到最大的 n 位数 题目描述 题目:输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999. 解答过 ...

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

    // 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. 解题思路: 首先是一个大陷阱,n ...

  9. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  10. 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...

随机推荐

  1. Java高级面试题解析(二):百度Java面试题前200页(精选)

    基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...

  2. 在vue项目中引入阿里图标库小记

    使用Vue技术栈开发不仅效率高,而且很友好,而且还有很多基于vue的UI框架,例如:element等,但是这类框架美中不足的是,图标太少.为了解决这个问题,不得不引入第三方字体库,今天以阿里图标库为例 ...

  3. Zookeeper开源客户端Curator的使用

    开源zk客户端-Curator 创建会话: RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramewor ...

  4. testlink搭建教程

    1,下载testlink安装包   请加QQ群299524235,在群文件中下载     2.配置Apache环境和PHP环境   解压testlink文件到Apache中, 通过127.0.0.1/ ...

  5. Linux 目录递归赋权,解决 Linux权限不够

    如你要操作一个目录下的文件时,系统提示 “权限不够”,可用以下方法解决. 如 test 文件目录. 1.用root账号登陆系统. 2.输入如下命令: chmod 777 test -R 这样访问.修改 ...

  6. Joda Time使用小结

    一.Joda Time基础操作 1. 构造指定时间 // 明确给出年月日时分秒,同时还可以指定毫秒 DateTime dateTime = new DateTime(2017,9,14,20,30,0 ...

  7. 详解python函数的参数

    详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...

  8. insertSql语句中的trim标签的使用

    insert into MB_BATCH_DIS_DETAILS    <trim prefix="(" suffix=")" suffixOverrid ...

  9. keras+ ctpn 原理流程图

  10. 浅析ebtables的概念和一些基本应用

    一.ebtables 是什么?   ebtables和iptables类似,都是Linux系统下网络数据包过滤的配置工具. 为什么叫配置工具呢?   是因为他们只制定规则,具体的实施者是内核!也就是说 ...