📜  级联十进制字符串中的第N个字符

📅  最后修改于: 2021-05-07 00:42:06             🧑  作者: Mango

如果所有的十进制数字的字符串连接在一起,然后我们会得到一个字符串,它看起来像字符串P,如下图所示。我们需要告诉这个字符串的第N个字符。
P =“ 12345678910111213141516171819202122232425262728293031…。”

例子:

N = 10    10th character is 1
N = 11    11th character is 0
N = 50    50th character is 3
N = 190    190th character is 1

我们可以通过按长度方向断开字符串来解决此问题。我们知道十进制的9个数字的长度为1,90个数字的长度为2,900个数字的长度为3,依此类推,因此我们可以根据给定的N跳过这些数字,并获得所需的字符。

Processing for N = 190 is explained below,
P[184..195] = “979899100101” 
First getting length of number at N,
190 – 9 = 181        number length is more than 1
181 – 90*2 = 1       number length is more than 2
1 – 900*3 < 0        number length is 3
Now getting actual character at N,
1 character after maximum 2 length number(99) is,  1

Processing for N = 251 is explained below,
P[250..255] = “120121”
First getting length of number at N,
251 - 9 = 242             number length is more than 1
242 – 90*2 = 62           number length is more than 2
62 – 900*3 < 0            number length is 3
Now getting actual character at N,
62 characters after maximum 2 length number(99) is,
Ceil(62/3) = 21,  99 + 21 = 120 
120 is the number at N, now getting actual digit,
62%3 = 2,
2nd digit of 120 is 2, so our answer will be 2 only.

请参阅下面的代码以更好地理解,

C++
// C++ program to get Nth character in
// concatenated Decimal String
#include 
using namespace std;
 
// Utility method to get dth digit of number N
char getDigit(int N, int d)
{
    string str;
    stringstream ss;
    ss << N;
    ss >> str;
    return str[d - 1];
}
 
// Method to return Nth character in concatenated
// decimal string
char getNthChar(int N)
{
    // sum will store character escaped till now
    int sum = 0, nine = 9;
 
    // dist will store numbers escaped till now
    int dist = 0, len;
 
    // loop for number lengths
    for (len = 1; ; len++)
    {
        // nine*len will be incremented characters
        // and nine will be incremented numbers
        sum += nine*len;
        dist += nine;
 
        if (sum >= N)
        {
            // restore variables to previous correct state
            sum -= nine*len;
            dist -= nine;
            N -= sum;
            break;
        }
        nine *= 10;
    }
 
    // get distance from last one digit less maximum
    // number
    int diff = ceil((double)N / len);
 
    // d will store dth digit of current number
    int d = N % len;
    if (d == 0)
        d = len;
 
    // method will return dth numbered digit
    // of (dist + diff) number
    return getDigit(dist + diff, d);
}
 
// Driver code to test above methods
int main()
{
    int N = 251;
    cout << getNthChar(N) << endl;
    return 0;
}


Java
// Java program to get Nth character in
// concatenated Decimal String
 
class GFG
{
     
// Utility method to get dth digit of number N
static char getDigit(int N, int d)
{
    String str=Integer.toString(N);
    return str.charAt(d - 1);
}
 
// Method to return Nth character in concatenated
// decimal string
static char getNthChar(int N)
{
    // sum will store character escaped till now
    int sum = 0, nine = 9;
 
    // dist will store numbers escaped till now
    int dist = 0, len;
 
    // loop for number lengths
    for (len = 1; ; len++)
    {
        // nine*len will be incremented characters
        // and nine will be incremented numbers
        sum += nine * len;
        dist += nine;
 
        if (sum >= N)
        {
            // restore variables to previous correct state
            sum -= nine * len;
            dist -= nine;
            N -= sum;
            break;
        }
        nine *= 10;
    }
 
    // get distance from last one digit
    // less maximum number
    int diff = (int)(Math.ceil((double)(N) / (double)(len)));
 
    // d will store dth digit of current number
    int d = N % len;
    if (d == 0)
        d = len;
 
    // method will return dth numbered digit
    // of (dist + diff) number
    return getDigit(dist + diff, d);
}
 
// Driver code
public static void main (String[] args)
{
    int N = 251;
    System.out.println(getNthChar(N));
}
}
 
// This code is contributed by mits


Python
# Python program to get Nth character in
# concatenated Decimal String
  
# Method to get dth digit of number N
def getDigit(N, d):
    string = str(N)
    return string[d-1];
  
# Method to return Nth character in concatenated
# decimal string
def getNthChar(N):
 
    #  sum will store character escaped till now
    sum = 0
    nine = 9
  
    #  dist will store numbers escaped till now
    dist = 0
  
    #  loop for number lengths
    for len in range(1,N):
     
        # nine*len will be incremented characters
        # and nine will be incremented numbers
        sum += nine*len
        dist += nine
        if (sum >= N):
         
            #  restore variables to previous correct state
            sum -= nine*len
            dist -= nine
            N -= sum
            break
             
        nine *= 10
  
    # get distance from last one digit less maximum
    # number
    diff = (N / len) + 1
  
    # d will store dth digit of current number
    d = N % len
    if (d == 0):
        d = len
  
    # method will return dth numbered digit
    # of (dist + diff) number
    return getDigit(dist + diff, d);
  
#  Driver code to test above methods
N = 251
print getNthChar(N)
 
# Contributed by Afzal_Saan


C#
// C# program to get Nth character in
// concatenated Decimal String
using System;
 
class GFG
{
     
// Utility method to get dth digit of number N
static char getDigit(int N, int d)
{
    string str = Convert.ToString(N);
    return str[d - 1];
}
 
// Method to return Nth character in
// concatenated decimal string
static char getNthChar(int N)
{
    // sum will store character
    // escaped till now
    int sum = 0, nine = 9;
 
    // dist will store numbers
    // escaped till now
    int dist = 0, len;
 
    // loop for number lengths
    for (len = 1; ; len++)
    {
        // nine*len will be incremented characters
        // and nine will be incremented numbers
        sum += nine * len;
        dist += nine;
 
        if (sum >= N)
        {
            // restore variables to previous
            // correct state
            sum -= nine * len;
            dist -= nine;
            N -= sum;
            break;
        }
        nine *= 10;
    }
 
    // get distance from last one digit
    // less maximum number
    int diff = (int)(Math.Ceiling((double)(N) /
                                  (double)(len)));
 
    // d will store dth digit of
    // current number
    int d = N % len;
    if (d == 0)
        d = len;
 
    // method will return dth numbered
    // digit of (dist + diff) number
    return getDigit(dist + diff, d);
}
 
// Driver code
static void Main()
{
    int N = 251;
    Console.WriteLine(getNthChar(N));
}
}
 
// This code is contributed by mits


PHP
= $N)
        {
            // restore variables to
            // previous correct state
            $sum -= $nine * $len;
            $dist -= $nine;
            $N -= $sum;
            break;
        }
        $nine *= 10;
    }
     
    // get distance from last one
    // digit less maximum number
    $diff = ($N / $len) + 1;
 
    // d will store dth digit
    // of current number
    $d = $N % $len;
    if ($d == 0)
        $d = $len;
 
    // method will return dth numbered
    // digit of (dist + diff) number
    return getDigit($dist + $diff, $d);
}
 
// Driver code
$N = 251;
echo getNthChar($N);
 
// This code is contributed by mits
?>


Javascript


输出:

2