题目描述

  输入数字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. ubuntu18.04下安装matlab2018a

    一.下载 百度网盘链接:https://pan.baidu.com/s/1M6KafnsljmYV9_5m_1pXMw 提取玛:jp76 二.安装 下载下来的文件夹中有三个文件,分别是破解文文件与映像 ...

  2. ASP.NET Core MVC 之视图组件(View Component)

    1.视图组件介绍 视图组件是 ASP.NET Core MVC 的新特性,类似于局部视图,但它更强大.视图组件不使用模型绑定,并且仅依赖于调用它时所提供的数据. 视图组件特点: 呈块状,而不是整个响应 ...

  3. 结构型设计模式——适配器模式(Go)

    适配器模式: 适配器模式是用于当别人提供的对象或接口中的方法或者其它属性啥的和我们的重复了,或者看的不顺眼.名字太长了记不住,而将其包装到一个对象中,然后通过你感觉自己舒服的方式或者方法名字去间接的调 ...

  4. GitHub项目:jkrasnay/sqlbuilder的使用

    http://www.jianshu.com/p/7f099b8cf5f0 技术选型: 在报表查询时,通常需要做可以动态添加的条件 在老项目中使用的是一种Tcondition的对象分装sql impo ...

  5. JVM调优之经验

    在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁.一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来 ...

  6. SAP-采购订单跟踪报表

    *&---------------------------------------------------------------------**& Report ZMM_CGDDFX ...

  7. 8.8 day29 异常处理 UDP通信

    异常处理 什么是异常? ​ 程序在运行过程中出现了不可预知的错误 ​ 并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 ​ 造成的影响就是整个程序无法运行 异常的结构 ​ 1.异常的类型 ​ ...

  8. 学习 Object-C: 简史

    对于一门语言的历史,我认为写一本书可能都不为过,关键是看你如何介绍和表达.当然每一个人的理解也大相径庭.本文阐述也仅仅只是冰山一角,如果需要深入了解,自己可能需要多花费一些心思. 这里也不会给大家说太 ...

  9. java代码实现搜索elasticsearch索引数据

    1.关于获取客户端以及增删改操作请看上一篇文章,文章中有详细的讲解 2.本篇文章讲述关于elasticsearch搜索匹配方式,主要有 match.match_phrase.term.regexp.w ...

  10. (三十五)c#Winform自定义控件-下拉框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...