剑指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 输入描述: 输入一个字符串 ...
随机推荐
- 使用git整体流程
一.git提交代码走meger请求的整体流程 工作中使用git推代码时,如果走merge请求,那么也就是说拉代码时拉公共代码库的代码,但是提交时需要先提交到自己的代码库,然后在gitlab上提交mer ...
- java隐士类型转换和强制类型转换
,byte和short型在计算时会自动转换为int型计算,结果也是int 型.所以a1*a2的结果是int 型的. byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,b ...
- for (Map.Entry<Long, Integer> me : zlSendMap.entrySet())
public static void main(String[] args) throws IOException { Map<String,String> map = new HashM ...
- schtasks确实可以绕过UAC,简直不可思议啊~~
https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx
- 用PostGreSQL实现三层(复习)
modal DAL,BLL都是类库的形式 最终结果如下: 数据库代码: -- Table: student -- DROP TABLE student; CREATE TABLE student ( ...
- Jenkins master在windows上安装
原文:http://www.cnblogs.com/itech/archive/2011/11/02/2233343.html 1 Jenkins Jenkins由以前的hudson更名而来.Jenk ...
- pyhton与json,Xml
对简单数据类型的encoding 和 decoding: 使用简单的json.dumps方法对简单数据类型进行编码,例如: 1 2 3 4 5 6 import json obj = [[1,2, ...
- POJ 1568 Find the Winning Move(极大极小搜索)
题目链接:http://poj.org/problem?id=1568 题意:给出一个4*4的棋盘,x和o两人轮流放.先放够连续四个的赢.给定一个局面,下一个轮到x放.问x是否有必胜策略?若有,输出能 ...
- Spring 注解@Transactional
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
- [HDOJ2512]一卡通大冒险(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2512 给一个数n,问1~n这n个数内的划分.设dp(i,j)为i划分为j个集合时有多少个. 初始化条件 ...