面试题17 打印从1到最大的n位数
package qustion17_print_number;
/**
* @Classname Solution
* @Description TODO
* @Date 2020/3/9 14:48
* @Created by mmz
*/
public class Solution {
//初始化
public static void solution1(int n){
//判断边界
if(n<=0){
throw new RuntimeException("n必须大于等于1");
}
char[] number = new char[n+1];
for(int i = 0;i<n+1;++i){
number[i] = '0';
}
while(!increment(number)){
pirntNumber(number);
}
}
public static boolean increment(char[] number){
int jinweiflag = 0;
for(int i = number.length-1;i>0;i--){
//如果是个位要加1
int nSum = number[i] - '0' + jinweiflag;
if(i == number.length-1){
nSum++;
}
if(nSum >=10){
if(i == 1){
number[0] = '1';
}else{
jinweiflag = 1;
number[i] = (char)(nSum-10+48);
}
}else{
jinweiflag = 0;
number[i] = (char)(nSum+48);
}
}
return number[0] == '1';
}
//打印数组
public static void pirntNumber(char[] number){
//判断一开始是不是0
boolean flag = true;
for(int i =0 ;i<number.length;i++){
if(flag && number[i] !='0'){
flag = false;
}
if(!flag && i==number.length-1){
System.out.println(number[i]);
break;
}
if(!flag)
System.out.print(number[i]);
}
}
public static void main(String[] args) {
solution1(3);
}
}
存在问题一个是引用类型与基本类型的传参
第二个问题 char类型的加减运算
二刷
package question17_打印从1到最大的n位数;
/**
* @Classname Main
* @Description TODO
* @Date 2020/4/11 18:43
* @Created by mmz
*/
public class Main {
static void Core(int n){
char[] number = new char[n+1];
for(int i = 0 ; i <=n ;++i){
number[i] = '0';
}
while(!CoreAdd(number)){
CorePrint(number);
}
}
static boolean CoreAdd(char[] number){
int flag = 0;
for(int i = number.length-1;i>=0;--i){
int sum = 0;
sum = flag+number[i]-'0';
if(i == number.length-1){
sum++;
}
if(sum>=10){
if(i == 1){
number[0] ='1';
break;
}
flag =1;
number[i] = (char)(sum-10+48);
}else{
flag = 0;
number[i] = (char)(sum+48);
}
}
return number[0] == '1';
}
static void CorePrint(char[] number){
boolean flag = true;
for(int i = 0;i<number.length;++i){
if(flag && number[i] != '0'){
flag =false;
}
if(!flag && i == number.length-1){
System.out.println(number[i]);
break;
}
if(!flag){
System.out.print(number[i]);
}
}
}
public static void main(String[] args) {
Core(3);
}
}
还是做了一段时间才做出来
一开始要建立n+1的数组,来存放当前的数字。
一个函数用来遍历循环+
一个函数用来打印
先说循环遍历加。每次在sum上面做文章,然后用sum的值再去反馈给数组number,这样如果是最后一位,每次都要+1,看是否有进位,如果有进位要加1,当前的位数的sum-10。对于其他位,就不需要考虑++的事情了,只需要判断当前sum只可能为10或者是0~9,当进位的时候,如果当前为数组的第二个数,说明,第一位 数变成了1,所以停止循环。
打印就很简单, 如果数组前面的数字都是00078,这个时候要把前面的0都不打印出来,只打印后面的78