12:打印1到最大的n位数
面试题12:打印1到最大的n位数##
剑指offer题目12,题目如下
输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999
方法一###
和面试题11《数值的整数次方》类似,乍看觉得都是简单题目,找出最大的n位数,开始逐个打印,写出代码
public static void method_1(int n )
{
int num = 1;
int i = 1;
while(i <= n)
{
num *= 10
i++;
}
for(i = 1;i < num; i++)
System.out.print(i +" ");
}
n的范围小还好,若n的取值很大,即需要考虑大数问题,这就是一个陷阱。正确的做法是使用字符串模拟数字的加法
。
方法二###
字符串模拟数字加法需要建立一个字符数组,每一个都存储'0'到'9'
某一个字符,首先把字符数组中每一位初始化 ‘0’
,然后每一次为字符数组做+1
操作,最后打印出来。其中的核心操作是
- 1.为字符数组做
+1
操作 - 2.打印数组
代码如下:
public static void method_2(int n)
{
if(n <= 0)
return;
char num[] = new char[n];
for(int i = 0; i < num.length; i++)
num[i] = '0';
int times = 0; //
while(!increment(num))//数组+1
{
print(num); //输出数组
times ++;
if(time % 10 == 0)//10个换行
{
System.out.println();
times = 0;
}
}
}
剑指offer原书中给出数组+1的方法increment
很巧妙,一种方法是字符串数组与最大的N位数99…99
匹配,相等则终止递增,但时间复杂度为O(n)
,另一种方法是在最高位(最左边位)发生了进位,返回True
,则就达到了最大的n位数,时间复杂度为O(1)
,代码如下
///模拟整数加法
public static boolean increment(char num[])
{
int remider = 0; //进位,5+7 = 12,此时remider=1
for(int i =num.length - 1; i >= 0;i--)
{
int count = num[i] - '0' + remider;
if(i == num.length - 1) //最后一位发生变化
count += 1;
if(count >= 10)
{
if(i == 0)
return true; //最高位发生进位
else
{
count -= 10;
remider = 1;
num[i] = (char) ('0' + count);
}
}
else
{
num[i] = (char) ('0' + count);
break;
}
}
return false;
}
接下开考虑如何打印数字,由于数字由字符数组表示,位数不足n的前面用0
补位,比如 当输入的n=3时,数字66的数组表示方式是066
,因此在输出的时候遇到前面首数字前面为0
的应该跳过去不打印
public static void print(char num[])
{
for(int i = 0;i <= num.length - 1;i++)
{
if(num[i] != '0')
{
for(int j = i;j <= num.length - 1;j++)
{
System.out.print(num[j]);
}
System.out.print(" ");
break;
}
}
}
结果:
方法三###
先给出一个问题,求0~100中数字7出现的个数
可以把数字化成这样00,01,02...98,99
,每一数位都是由0到9排列一遍,总共出现100 * 2 = 200个数字,由于0~9这10个数出现的次数相等,则7出现了 200/10
= 20次。
同理,可以在所有的数字前面补0,就会得到n位数字,每一位都是0~9的全排列,只是排在数字前面的0我们不打印出来,由于每一位都是0-9的全排列,可以想到使用递归思路,求数字的全排列Permutation
也是类似思想,但有少许区别
// 使用递归
public static void method_3(int n)
{
if(n <= 0)
return;
char num[] = new char[n];
for(int i = 0; i < 10; i++)
{
num[0] = (char) (i + '0');//第0位 全排列0~9
recursive(num,n ,0);
}
}
public static void recursive(char num[],int length ,int index) //index全排列到第几位了
{
if(index == length - 1)
{
System.out.println();
print(num);
return;
}
for(int i = 0; i < 10; i++)
{
num[index + 1] = (char) (i + '0');
recursive(num,length,index + 1);
}
}
总结###
题目简单么?这可要比这些天做的各大公司笔试题算法题目简单太多了,有些公司出的题需要看半天才能表达的意思。这么容易理解的题目如果真是bug free 的做出来还真是有些难度,本节两个关键点:
- 字符串模拟整数的加法
- 递归方法全排列数字
12:打印1到最大的n位数的更多相关文章
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- 面试题12:打印1到最大的n位数
// 面试题12_打印1到最大的n位数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...
- 题目12 打印1到最大的n位数
///////////////////////////////////////////////////////////////////////////////////// // 2.打印1到最大的n位 ...
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 12 打印1到最大的n位数
输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999.由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 cha ...
- 《剑指offer》面试题12 打印1到最大的n位数 Java版
书中方法:这道题的一个陷阱在于不能用int或者long去存储你要打印的数,然后用打印函数打印,因为这个数可能会很大.如果加1后超出了最大的n位数,就不打印了.用最高位是否进位判断是否结束,打印的时候注 ...
- 剑指offer-面试题12.打印1到最大的n位数
题目:输入数字n,按照打印出从1最大的n位10进制数.比如3,则 打印出1.2.3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那 只能说明你---太天真. 2.n=3尚可,如果n= ...
- 《剑指offer》面试题12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
- 【面试题012】打印1到最大的n位数
[面试题012]打印1到最大的n位数 大数问题 字符串中的每一个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个长度为n+1的字符串,字符串的最后 ...
随机推荐
- python爬虫之urllib库介绍
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- elk6.3 centos集群搭建 head插件安装
版本elk均为6.3+centos7.0 准备工作 官网下载elk6.3的linux环境的压缩包,sftp上传 下载对应的head插件sftp上传到指定目录 tar.gz文件解压 tar -zxvf ...
- 自动化jenkins报:ModuleNotFoundError: No module named 'common'
直接执行脚本是没有问题,报如下错误: 你已经在run.py脚本加路径了为什么还会报这个错呢,就是你加的路径,应该在所有的包上面,才不会报这个错,如下: 注:以下是我的解决方法仅作参考.如果我的发表的内 ...
- Jmeter参数的AES加密使用
在Jmeter日常实践中,大家应该都遇到过接口传参需要加密的情况.以登陆为例,用户名和密码一般都需要进行加密传输,在服务端再进行解密,这样安全系数会更高,但在使用jmeter进行接口测试的时候,怎样发 ...
- python里的魔法方法1(构造与析构)
魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...
- mysql 优化之 doublewrite buffer 机制
是什么? doublewrite buffer是mysql 系统表空间的一块存储区域. 有什么用? 在Innodb将数据页写到数据存储文件之前,存储从Innodb缓存池刷过来的数据页.且只有将数写入d ...
- CocoStuff—基于Deeplab训练数据的标定工具【五、训练成果分析】
一.说明 本文为系列博客第五篇,主要展示训练的结果,以及对训练进行分析. *注:暂未进行大量的数据训练以及IoU测算,目前只做到使用Matlab将训练结果的mat文件可视化. 二. *占坑
- word2vec入门理解的博客整理
深度学习word2vec笔记之基础篇 https://blog.csdn.net/mytestmy/article/details/26961315 深度学习word2vec笔记之算法篇 https: ...
- Ajax中post后台.net MVC中Controller的路径问题。
今天使用ajax的post方法,去访问mvc的controller,url的传值是 "//ProductCatalog/PostShareInfo",发现无论如何都访问不到. 我实 ...
- Django_rest_framework_渲染器/解析器/路由控制/分页
目录 渲染器 解析器 路由控制 分页 渲染器 简介 什么是渲染器 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 渲染器的作用 序列化.友好的展示数据 渲染器配置 首先要在set ...