[劍指Offer]- 數字序列中某一位的數字

題目描述

數字以01234567891011121314…的格式排列。在這個序列中,第5位(從0開始計)是5,第13位是1,第19位是4。求任意第n爲對應的數字。

這是個數學規律題

解題思路

  • 每次枚舉一個數字的時候,求出數字是幾位數,並把該數字的位數和前面所有的數字的位數累加
    -當和大於該數,則第n位數一定在這裏面
算法圖解

在這裏插入圖片描述

參考代碼:
package offer;

/**
 * 數字序列中某一位的數字
 */
public class Offer44 {
    public static void main(String[] args) {
        String num = "01234567891011121314151617181920";
        System.out.println(findNumber(num, 19));
    }

    /**
     * 無腦比對
     * 0-9 位數求和-->10   10-20 位數求和--->20         如求第11位   11是二位數 只有理論上應該是10+1 但是目前10+2
     * 時間複雜O(n)
     *
     * @param num
     * @return
     */
    static char findNumber(String num, int n) {
        int temp = n;
        int index2 = 1;
        int sum = 1;
        for (int i = 0; i < temp; i++) {
            while (i > 0) {
                i = i / 10;
                index2++;         //計算當前n的位數
            }
            if (sum > temp) {
                sum = sum - 1;
                break;
            }
            sum += index2;
            index2 = 0;
        }
        return num.charAt(sum);
    }
}


附錄

該題源碼在我的 ?Github 上面!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章