数组是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可以直接赋值给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