演算法,有一個從1到正無窮的無限大數字陣列,每個數字佔1位,求第n位是幾
阿新 • • 發佈:2019-01-10
陣列是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