剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)
题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止。
本题陷阱:没有考虑到大数的问题。
本题解题思路:将要打印的数字,看成字符串,不足位的,高位补0。打印字符串的时候要对数字进行判断,不要将高位的0打印出来。打印字符串的结束条件是,当最高位产生进位时结束。
c++代码:
#include<iostream>
using namespace std;
//字符串模拟加法
bool Increment(char* number)
{
//溢出判定
bool isOverFlow = false;
//进位
int nTakeOver = ;
//长度
int nLength = strlen(number); for(int i = nLength - ; i >= ; i--)
{
//第n位的值等于第n位字母的ascii减去 0 的ascii 再加第n+1位的进位
int nSum = number[i] - '' + nTakeOver;
if(i == nLength - )
++nSum;
if(nSum >= )
{
if(i == )
isOverFlow = true;
else
{
nSum -= ;
nTakeOver = ;
number[i] = '' + nSum;
}
}
else
{
number[i] = '' + nSum;
break;
}
}
return isOverFlow;
}
//打印字符串表示的数字
void PrintNumber(char* number)
{
bool isBegining0 = true;
int nLength = strlen(number); for(int i = ; i< nLength; ++i)
{
if(isBegining0 && number[i] != '')
isBegining0 = false;
if(!isBegining0)
{
printf("%c",number[i]);
}
}
printf("\t");
}
void Print1ToNDigits(int n)
{
if(n<)
return;
char *number = new char[n+];
memset(number, '', n);
number[n] = '\0';
while(!Increment(number))
{
PrintNumber(number);
//printf("%s \n",number);
} delete []number;
}
void main(){
//输出到文件
//freopen("output.txt","w",stdout);
Print1ToNDigits();
}
Java代码:
思路:将n位数看做排列组合问题,有3个位置,每个位上从0到9中选一个数字放进去,求所有的排列情况。
三个位置是依次放进去数字的,这可以用递归。
每个位置上0到9的十种情况可以用for循环来遍历。
另外,记得函数最开始进入时要检查边界条件。
public class Print1ToMaxOfNDigits {
/**打印从1到最大的N位十进制数
* @param n 位数
*/
public static void print1ToMaxOfNDigits(int n){
//先检查边界条件
if(n<=0)
return;
char[] result=new char[n];
printRecursively(result,0);
}
/** 将n位数看做排列组合问题,每个位上从0到9中选一个数字,这样n位数可以在递归中形成。
* @param result 存储n位数,每个元素是一位
* @param index 第index位从0到9中取一个数字。第index位取完数字后,index加1,递归,让下一位选数字。直到i等于result的长度为止,
* 这时n位数就形成了,打印它,回退一步改变最后位置的数字。这样递归下去直到所有数字都打印完毕
*/
private static void printRecursively(char[] result, int index) {
if (index==result.length) {
printNumber(result);
return;
}
for(int i=0;i<10;i++){
result[index]=(char) (i+'0');
printRecursively(result, index+1);
}
}
/** 高位是0的话不打印,直到遇到不是0的数字为止,截取这一位直到结束的字符串,打印之。
* @param result
*/
private static void printNumber(char[] result) {
// TODO Auto-generated method stub
String s=String.valueOf(result);
for (int i = 0; i < result.length; i++) {
if (result[i]!='0') {
System.out.println(s.substring(i));
return;
}
}
}
public static void main(String[] args){
print1ToMaxOfNDigits(2);
}
}
剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)的更多相关文章
- 剑指offer—第三章高质量代码(数值的整数次方)
高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...
- 剑指offer—第三章高质量代码(o(1)时间删除链表节点)
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...
- 剑指offer—第三章高质量代码(合并两个排序链表)
题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...
- 剑指offer第三章
剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...
- 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)
题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ...
- 剑指offer-第三章高质量的代码(调整数组顺序使得奇数位于偶数的前面)
题目:输入一个整数数组,实现一个函数中调整该数组中数字的顺序,使得所有的奇数位于数组的前半部,所有偶数位于数组的后半部. 思路:用两个指针p1和p2,分别指向数组的头和尾部,p1只向后移,p2只向前移 ...
- (剑指Offer)面试题61:按之字形顺序打印二叉树
题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路: 按照广度优先遍历来遍历二叉树,但是需要 ...
- 剑指offer第五章
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
- 剑指offer第七章&第八章
剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...
随机推荐
- POJ 3304 Segments (直线与线段是否相交)
题目链接 题意 : 能否找出一条直线使得所有给定的线段在该直线上的投影有一个公共点. 思路 : 假设存在一条直线a使得所有线段在该直线上的投影有公共点,则必存在一条垂直于直线a的直线b,直线b与所有线 ...
- ExtJs之Ext.query
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- TCP/IP协议 三次握手与四次挥手【转】
一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号 ...
- JavaScript基于对象编程
js面向对象特征介绍 javascript是一种面向(基于)对象的动态脚本语言,是一种基于对象(Object)和事件驱动(EventDirven)并具有安全性能的脚本语言.它具有面向对象语言所特有的各 ...
- MongoDB (三) MongoDB 安装
MongoDB安装在Windows上 在 Windows上,首先要安装 MongoDB下载最新发布的MongoDB: http://www.mongodb.org/downloads 确保得到正确的版 ...
- linux 系统优化
- javaScript解决Form的嵌套
HTML是不允许FORM嵌套的,用一个简单的JAVASCRIPT就可以解决问题了 <script language=javascript> function process(v){ if( ...
- Linux基础--文件与目录管理
1.目录与路径 1)特殊目录 . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表『目前使用者身份』所在的家目录 ~account 代表account这个使用者的 ...
- python urllib2的proxyhandler
1. 再a方法中新建了个opener,使用了代理: proxydict = {} proxydict['http'] = "http://%s:%s"%(ip,port) #pri ...
- 一行代码设置TForm颜色的前世今生(属性赋值引起函数调用,然后发消息实现改变显示效果),TForm的初始颜色在dfm中设置了clBtnFace色
来自万一的帖子:http://www.cnblogs.com/del/archive/2008/04/27/1173658.html的确做到了一行代码设置TForm控件的颜色(一点感想:Delphi程 ...