1. 程式人生 > >演算法,有一個從1到正無窮的無限大數字陣列,每個數字佔1位,求第n位是幾

演算法,有一個從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