劍指offer js實現求數字序列中某一位的數字

2021-10-01 19:15:21 字數 1148 閱讀 1698

題目:數字以012345678910111213…序列化,請編寫乙個函式,輸入第n位找到第n位的數字

比如5 輸出5 13輸出1 19輸出4 1001輸出7

思路:窮舉出所有的數字,每窮舉出乙個數字,總長度加上這個數字的長度。如果總長度大於n,那麼需要輸出的數字就在當前數字中

//求出數字所對應的位數

const

getnumw

= n =>

return w;

}const

getnum

= n =>

n++;let i =0;

let w =0;

while

(n > w)

// console.log(i-1,w,n);

let num = math.

floor

((i-1)

/math.

pow(10,

(w-n)))

return num>

9?num%

10:num;

}

思路2:窮舉法解決問題時間複雜度太高了,需要尋找規律來解決問題.

除掉前十個數字以外,兩位數是90個,3位數是270個…n位數是n*9*math.pow(10,n-1)個

所以假設是要求第90位,那麼去掉剛開始10個,為80位,80<90 則為二位數 80/2 === 40餘數0 則為二位數中第41個數的第0位 就是5

const

goodfun

= n =>

if(n<10)

const

getnumww

= w =>

n -=10;

let w =2;

let x =

getnumww

(w);

while

(x < n)

// console.log(`x=$,w=$,n=$`);

return

parseint

((math.

pow(

10,w-1)

+math.

floor

(n/w)).

tostring()

[n%w]

)}

劍指offer c 數字序列中某位數的數字

題目 數字以0123456789101112131415.的格式序列化到乙個字串序列中。這個字串,第5位是5 從0開始計數 第13位是1,第19位是4。請寫出乙個函式,求任意第 位數。解題思路 先確定 的範圍,然後減去前面的範圍,除上位數,同時取餘位數 求出該範圍內的數,在加上之前的範圍真實數,就是...

劍指offer js實現剪繩子

題目 給你一根長度為n的繩子,請剪成m段n 1,m 1,使剩下的繩子乘積為最大值.例 8 2 3 3 18 思路 動態規劃,比如8,第一次切割可以分成8 1種切法,將最優解儲存起來。let n 8 function cut if res n return res n let max 0 for le...

劍指44 數字序列中某一位的數字

題目 數字按照0123456789101112131415161718192021 的順序排列。第5位 從0開始計數 為5,第13位為1,第19位為4 求任意第n位對應的數字。思路 從 0 9的10個數是1位數 10 99是兩位數 100 999是三位數 除了1位數之外 其他n位數 佔據的順序排列的...