算法,有一个从1到正无穷的无限大数字数组,每个数字占1位,求第n位是几

数组是1,2,3,4,5,6,7,8,9,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,2,0,........

求第n位是几。

我是用java实现的,解题过程中还研究了一下char转int,Integer.parseInt(String,int)和Integer.valueOf(String)的区别。

入手点就是找出n是个几位数以及这个数是多少。

代码如下

public static char getnum(String str,int n){  //str是数列,n是要求的位数
        int m = n; //对n做个备份
        char[] strings = str.toCharArray(); //将字符串按位分解
        /**
         * 1-9有9个数每个数字占1位,10-99有90个数每个数字占2位,100-999有900个数每个数字占3位,以此类推
         * 用当前位数从1-9占的位开始减,然后是10-99,100-999,从小到大以此类推,减到某一档位数小于0了,说明这位的数字属于这一档
         * (所求位数-之前各档位占用位数和)/当前档位 = 这个数-1是这一档位中的第几个数   (java向下取整,从第0个数开始,如10是第0个数)
         * (所求位数-之前各档位占用位数和)%当前档位 = 这一位是目标数字的第几位   (如果整除了说明这是这个数的最后一位,没整除就是下一个数的对应数)
         */
        for(int i=1,j=1;;i=i*10,j++){  				//i用来存放1,10,100.....即档位,j存放对应档位的数字占几位
            if((m - (9*i*j)) < 0){   				//目标位数-当前档位占用的位数<0说明目标数字在这个档位中
                char[] num = ((i + m / j - 1)+"").toCharArray();  //把求得的数字放入数组中,方便按位取
                int remainder = m % j;  //获得余数
                if(remainder == 0){
                    return num[j-1];
                }else{
                    num = ((m / j)+"").toCharArray();
                    return num[remainder-1];
                }
            }else{  //继续减下一个档位
                m = m - (9*i*j);
            }
        }
    }


这里用char作为返回值是因为String转成了char[] ,返回char输出方便。

char可以直接赋值给int,但是存放的是对应的askii码的值,而不是期望的数字。比如

char a = '0';
int b = a;

输出结果是a:0,b:48

char转int有2种方式,一种是int=char-48,在askii码中数字0对应48,1对应49....9对应57。

另一种是将char转成String,可以通过+“”实现,然后再用String转成int,可以用Integer.parseInt(String,int)和Integer.valueOf(String)。

这样就引出了Integer.parseInt(String,int)和Integer.valueOf(String)有什么区别,下面是valueOf的源码

public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
可以看出,valueOf也调用的是parseInt,只是多封装了一个Integer对象, 在10进制的数上这两个方法没啥区别,用哪个都行。

这里调用parseInt时第二个参数是固定的10,说明valueOf只解析10进制的数字字符串

但是parseInt解析字符串的范围更广。Integer.parseInt(String,int)第一个参数是要解析的字符串,第二个参数是标明被解析字符串是几进制的。

parseInt可以把多种进制的字符串转成10进制。

以下是官方文档给出的例子

* parseInt("0", 10) returns 0
* parseInt("473", 10) returns 473
* parseInt("+42", 10) returns 42
* parseInt("-0", 10) returns 0
* parseInt("-FF", 16) returns -255
* parseInt("1100110", 2) returns 102
* parseInt("2147483647", 10) returns 2147483647
* parseInt("-2147483648", 10) returns -2147483648
* parseInt("2147483648", 10) throws a NumberFormatException
* parseInt("99", 8) throws a NumberFormatException
* parseInt("Kona", 10) throws a NumberFormatException
* parseInt("Kona", 27) returns 411787



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值