參考資料
劍指 Offer 44. 數(shù)字序列中某一位的數(shù)字
中等
351
相關(guān)企業(yè)
數(shù)字以0123456789101112131415…的格式序列化到一個字符序列中。在這個序列中,第5位(從下標(biāo)0開始計(jì)數(shù))是5,第13位是1,第19位是4,等等。
請寫一個函數(shù),求任意第n位對應(yīng)的數(shù)字。
示例 1:
輸入:n = 3
輸出:3
示例 2:
輸入:n = 11
輸出:0
限制:
0 <= n < 2^31文章來源:http://www.zghlxwxcb.cn/news/detail-615845.html
思路:
其實(shí)并沒有什么特別的……就是數(shù)數(shù),邊數(shù)邊刪(見下面代碼的while循環(huán)),直到最后落在某個區(qū)間,這就能確定目標(biāo)所在的位置是 幾位數(shù)的群體(即退出while循環(huán)后的digit, 如果digit=2,那么說明落在10-99之間),
再在這個群體里定位是哪一個數(shù)字(見int num那一行。比如,27);
進(jìn)一步,定位是這個數(shù)字的哪一位(見最后的return語句。比如,第一位,即7)
注意:從0開始數(shù),也就是0就是第0位,1就是第1位。文章來源地址http://www.zghlxwxcb.cn/news/detail-615845.html
class Solution {
public int findNthDigit(int n) {
int digit=1;
int count=9;//
int start=1;
while(n>count){
n-=count;
digit++;
start*=10;
count = digit*start*9;//10-99, 100-999,
}
int num = start+(n-1)/digit;
return Long.toString(num).charAt((n-1)%digit)-'0';// !! 注意這里取出第((n-1)%digit)個字符之后,怎么將它轉(zhuǎn)化為整數(shù)再返回
}
// 參考資料:下面是LeetCode,K神的代碼,可以看到大神把start,count這些增長比較快的數(shù)設(shè)置成Long型;注意最后將某個字符轉(zhuǎn)成數(shù)字的代碼;注意這代碼已經(jīng)將n=0的情況考慮在內(nèi),此時不進(jìn)入while循環(huán),(n-1)/digit=-1, so num=0.
public int findNthDigit2(int n) {
int digit = 1;
long start = 1;
long count = 9;
while (n > count) { // 1.
n -= count;
digit += 1;
start *= 10;
count = digit * start * 9;
}
long num = start + (n - 1) / digit; // 2.
return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.
}
}
到了這里,關(guān)于劍指 Offer 44.!! 數(shù)字序列中某一位的數(shù)字的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!