📜  范围内没有重复数字的总数

📅  最后修改于: 2021-04-27 21:08:15             🧑  作者: Mango

给定范围L, R在给定范围内找到总数,以使它们没有重复的数字。
例如:
12没有重复的数字。
22有重复的数字。
102、194和213没有重复的数字。
212、171和4004具有重复的数字。

例子:

Input : 10 12
Output : 2
Explanation : In the given range 
10 and 12 have no repeated digit 
where as 11 has repeated digit.

Input : 1 100
Output : 90

蛮力

我们将遍历给定范围内的每个元素,并对没有重复数字的数字进行计数。

C++
// C++ implementation of brute
// force solution.
#include 
using namespace std;
  
// Function to check if the given
// number has repeated digit or not
int repeated_digit(int n)
{
    unordered_set s;
  
    // Traversing through each digit
    while(n != 0)
    {
        int d = n % 10;
  
        // if the digit is present
        // more than once in the
        // number
        if(s.find(d) != s.end())
        {
            // return 0 if the number
            // has repeated digit
            return 0;
        }
        s.insert(d);
        n = n / 10;
    }
    // return 1 if the number has 
    // no repeated digit
    return 1;
}
  
// Function to find total number
// in the given range which has
// no repeated digit
int calculate(int L,int R)
{
    int answer = 0;
  
    // Traversing through the range
    for(int i = L; i < R + 1; ++i)
    {
  
        // Add 1 to the answer if i has
        // no repeated digit else 0
        answer = answer + repeated_digit(i);
    }
  
    return answer ;
}
  
// Driver Code
int main()
{
    int L = 1, R = 100;
  
    // Calling the calculate
    cout << calculate(L, R);
    return 0;
}
  
// This code is contributed by
// Sanjit_Prasad


Java
// Java implementation of brute 
// force solution. 
import java.util.LinkedHashSet;
  
class GFG
{
// Function to check if the given 
// number has repeated digit or not 
static int repeated_digit(int n) 
{
    LinkedHashSet s = new LinkedHashSet<>();
  
    // Traversing through each digit 
    while (n != 0) 
    {
        int d = n % 10;
  
        // if the digit is present 
        // more than once in the 
        // number 
        if (s.contains(d))
        {
            // return 0 if the number 
            // has repeated digit 
            return 0;
        }
        s.add(d);
        n = n / 10;
    }
      
    // return 1 if the number has 
    // no repeated digit 
    return 1;
}
  
// Function to find total number 
// in the given range which has 
// no repeated digit 
static int calculate(int L, int R) 
{
    int answer = 0;
  
    // Traversing through the range 
    for (int i = L; i < R + 1; ++i) 
    {
  
        // Add 1 to the answer if i has 
        // no repeated digit else 0 
        answer = answer + repeated_digit(i);
    }
  
    return answer;
}
  
// Driver Code 
public static void main(String[] args) 
{
    int L = 1, R = 100;
      
    // Calling the calculate 
    System.out.println(calculate(L, R));
}
}
  
// This code is contributed by RAJPUT-JI


Python3
# Python implementation of brute 
# force solution.
  
# Function to check if the given 
# number has repeated digit or not 
def repeated_digit(n):
    a = []
      
    # Traversing through each digit
    while n != 0:
        d = n%10
          
        # if the digit is present
        # more than once in the
        # number
        if d in a:
              
            # return 0 if the number
            # has repeated digit
            return 0
        a.append(d)
        n = n//10
      
    # return 1 if the number has no
    # repeated digit
    return 1
  
# Function to find total number
# in the given range which has 
# no repeated digit
def calculate(L,R):
    answer = 0
      
    # Traversing through the range
    for i in range(L,R+1):
          
        # Add 1 to the answer if i has
        # no repeated digit else 0
        answer = answer + repeated_digit(i)
      
    # return answer
    return answer
      
# Driver's Code 
L=1
R=100
  
# Calling the calculate
print(calculate(L, R))


C#
// C# implementation of brute 
// force solution. 
using System; 
using System.Collections.Generic; 
  
class GFG 
{
  
// Function to check if the given 
// number has repeated digit or not 
static int repeated_digit(int n)
{
    var s = new HashSet();
  
    // Traversing through each digit 
    while (n != 0)
    {
        int d = n % 10;
  
        // if the digit is present 
        // more than once in the 
        // number 
        if (s.Contains(d)) 
        {
            // return 0 if the number 
            // has repeated digit 
            return 0;
        }
        s.Add(d);
        n = n / 10;
    }
      
    // return 1 if the number has 
    // no repeated digit 
    return 1;
}
  
// Function to find total number 
// in the given range which has 
// no repeated digit 
static int calculate(int L, int R) 
{
    int answer = 0;
  
    // Traversing through the range 
    for (int i = L; i < R + 1; ++i) 
    {
  
        // Add 1 to the answer if i has 
        // no repeated digit else 0 
        answer = answer + repeated_digit(i);
    }
  
    return answer;
}
  
// Driver Code 
public static void Main(String[] args)
{
    int L = 1, R = 100;
      
    // Calling the calculate 
    Console.WriteLine(calculate(L, R));
}
}
  
// This code is contributed by RAJPUT-JI


PHP
 0)
    {
        $d = $n % 10;
          
        // if the digit is present
        // more than once in the
        // number
        if ($a[$d] > 0)
        {
            // return 0 if the number
            // has repeated digit
            return 0;
        }
        $a[$d]++;
        $n = (int)($n / 10);
    }
      
    // return 1 if the number 
    // has no repeated digit
    return 1;
}
  
// Function to find total 
// number in the given range 
// which has no repeated digit
function calculate($L, $R)
{
    $answer = 0;
      
    // Traversing through
    // the range
    for($i = $L; $i <= $R; $i++)
    {
          
        // Add 1 to the answer if 
        // i has no repeated digit
        // else 0
        $answer += repeated_digit($i);
    }
      
    // return answer
    return $answer;
} 
  
// Driver Code 
$L = 1;
$R = 100;
  
// Calling the calculate
echo calculate($L, $R);
  
// This code is contributed by mits
?>


C++
// C++ implementation of above idea 
#include  
  
using namespace std;
  
// Maximum 
int MAX = 1000;
  
// Prefix Array 
vector Prefix = {0};
  
// Function to check if the given 
// number has repeated digit or not 
int repeated_digit(int n)
{
      
    unordered_set a;
    int d;
      
    // Traversing through each digit 
    while (n != 0)
    {
        d = n % 10;
          
        // if the digit is present 
        // more than once in the 
        // number 
        if (a.find(d) != a.end()) 
              
            // return 0 if the number 
            // has repeated digit 
            return 0;
          
        a.insert(d); 
        n = n / 10;
    }
      
    // return 1 if the number has no 
    // repeated digit 
    return 1;
}
  
// Function to pre calculate 
// the Prefix array 
void pre_calculation(int MAX)
{
      
    Prefix.push_back(repeated_digit(1));
      
    // Traversing through the numbers 
    // from 2 to MAX 
    for (int i = 2; i < MAX + 1; i++) 
          
        // Generating the Prefix array 
        Prefix.push_back(repeated_digit(i) + Prefix[i-1]);
}
  
// Calclute Function 
int calculate(int L,int R)
{ 
      
    // Answer 
    return Prefix[R] - Prefix[L-1];
}
  
// Driver code
int main()
{
    int L = 1, R = 100;
      
    // Pre-calculating the Prefix array. 
    pre_calculation(MAX);
      
    // Calling the calculate function 
    // to find the total number of number 
    // which has no repeated digit 
    cout << calculate(L, R) << endl; 
  
    return 0;
}
  
// This code is contributed by Rituraj Jain


Java
// Java implementation of above idea
import java.util.*;
  
class GFG 
{
  
    // Maximum
    static int MAX = 100;
  
    // Prefix Array
    static Vector Prefix = new Vector<>();
  
    // Function to check if the given
    // number has repeated digit or not
    static int repeated_digit(int n)
    {
        HashSet a = new HashSet<>();
        int d;
  
        // Traversing through each digit
        while (n != 0) 
        {
            d = n % 10;
  
            // if the digit is present
            // more than once in the
            // number
            if (a.contains(d))
  
                // return 0 if the number
                // has repeated digit
                return 0;
            a.add(d);
            n /= 10;
        }
  
        // return 1 if the number has no
        // repeated digit
        return 1;
    }
  
    // Function to pre calculate
    // the Prefix array
    static void pre_calculations() 
    {
        Prefix.add(0);
        Prefix.add(repeated_digit(1));
  
        // Traversing through the numbers
        // from 2 to MAX
        for (int i = 2; i < MAX + 1; i++)
  
            // Generating the Prefix array
            Prefix.add(repeated_digit(i) + Prefix.elementAt(i - 1));
    }
  
    // Calclute Function
    static int calculate(int L, int R)
    {
  
        // Answer
        return Prefix.elementAt(R) - Prefix.elementAt(L - 1);
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int L = 1, R = 100;
  
        // Pre-calculating the Prefix array.
        pre_calculations();
  
        // Calling the calculate function
        // to find the total number of number
        // which has no repeated digit
        System.out.println(calculate(L, R));
    }
}
  
// This code is contributed by
// sanjeev2552


Python3
# Python implementation of 
# above idea
  
# Prefix Array
Prefix = [0]
  
# Function to check if 
# the given number has 
# repeated digit or not 
def repeated_digit(n):
    a = []
      
    # Traversing through each digit
    while n != 0:
        d = n%10
          
        # if the digit is present
        # more than once in the
        # number
        if d in a:
              
            # return 0 if the number
            # has repeated digit
            return 0
        a.append(d)
        n = n//10
      
    # return 1 if the number has no
    # repeated digit
    return 1
  
# Function to pre calculate
# the Prefix array
def pre_calculation(MAX):
      
    # To use to global Prefix array
    global Prefix
    Prefix.append(repeated_digit(1))
      
    # Traversing through the numbers
    # from 2 to MAX
    for i in range(2,MAX+1):
          
        # Generating the Prefix array 
        Prefix.append( repeated_digit(i) +
                       Prefix[i-1] )
  
# Calclute Function
def calculate(L,R):
      
    # Answer
    return Prefix[R]-Prefix[L-1]
  
  
# Driver Code
  
# Maximum 
MAX = 1000
  
# Pre-calculating the Prefix array.
pre_calculation(MAX)
  
# Range
L=1
R=100
  
# Calling the calculate function
# to find the total number of number
# which has no repeated digit
print(calculate(L, R))


C#
// C# implementation of above idea
using System;
using System.Collections.Generic;
  
class GFG 
{
  
    // Maximum
    static int MAX = 100;
  
    // Prefix Array
    static List Prefix = new List();
  
    // Function to check if the given
    // number has repeated digit or not
    static int repeated_digit(int n)
    {
        HashSet a = new HashSet();
        int d;
  
        // Traversing through each digit
        while (n != 0) 
        {
            d = n % 10;
  
            // if the digit is present
            // more than once in the
            // number
            if (a.Contains(d))
  
                // return 0 if the number
                // has repeated digit
                return 0;
            a.Add(d);
            n /= 10;
        }
  
        // return 1 if the number has no
        // repeated digit
        return 1;
    }
  
    // Function to pre calculate
    // the Prefix array
    static void pre_calculations() 
    {
        Prefix.Add(0);
        Prefix.Add(repeated_digit(1));
  
        // Traversing through the numbers
        // from 2 to MAX
        for (int i = 2; i < MAX + 1; i++)
  
            // Generating the Prefix array
            Prefix.Add(repeated_digit(i) + 
                           Prefix[i - 1]);
    }
  
    // Calclute Function
    static int calculate(int L, int R)
    {
  
        // Answer
        return Prefix[R] - Prefix[L - 1];
    }
  
    // Driver Code
    public static void Main(String[] args)
    {
        int L = 1, R = 100;
  
        // Pre-calculating the Prefix array.
        pre_calculations();
  
        // Calling the calculate function
        // to find the total number of number
        // which has no repeated digit
        Console.WriteLine(calculate(L, R));
    }
}
  
// This code is contributed by 29AjayKumar


输出:
90

该方法将在O(N)时间内回答每个查询。

高效方法

我们将计算没有重复数字的数字的前缀数组。

Prefix[i] =总位数,没有重复的数字小于或等于1。

因此,每个查询都可以在O(1)时间内解决。

 Answer = Prefix[R] - Prefix[L-1]

以下是上述想法的实现。

C++

// C++ implementation of above idea 
#include  
  
using namespace std;
  
// Maximum 
int MAX = 1000;
  
// Prefix Array 
vector Prefix = {0};
  
// Function to check if the given 
// number has repeated digit or not 
int repeated_digit(int n)
{
      
    unordered_set a;
    int d;
      
    // Traversing through each digit 
    while (n != 0)
    {
        d = n % 10;
          
        // if the digit is present 
        // more than once in the 
        // number 
        if (a.find(d) != a.end()) 
              
            // return 0 if the number 
            // has repeated digit 
            return 0;
          
        a.insert(d); 
        n = n / 10;
    }
      
    // return 1 if the number has no 
    // repeated digit 
    return 1;
}
  
// Function to pre calculate 
// the Prefix array 
void pre_calculation(int MAX)
{
      
    Prefix.push_back(repeated_digit(1));
      
    // Traversing through the numbers 
    // from 2 to MAX 
    for (int i = 2; i < MAX + 1; i++) 
          
        // Generating the Prefix array 
        Prefix.push_back(repeated_digit(i) + Prefix[i-1]);
}
  
// Calclute Function 
int calculate(int L,int R)
{ 
      
    // Answer 
    return Prefix[R] - Prefix[L-1];
}
  
// Driver code
int main()
{
    int L = 1, R = 100;
      
    // Pre-calculating the Prefix array. 
    pre_calculation(MAX);
      
    // Calling the calculate function 
    // to find the total number of number 
    // which has no repeated digit 
    cout << calculate(L, R) << endl; 
  
    return 0;
}
  
// This code is contributed by Rituraj Jain

Java

// Java implementation of above idea
import java.util.*;
  
class GFG 
{
  
    // Maximum
    static int MAX = 100;
  
    // Prefix Array
    static Vector Prefix = new Vector<>();
  
    // Function to check if the given
    // number has repeated digit or not
    static int repeated_digit(int n)
    {
        HashSet a = new HashSet<>();
        int d;
  
        // Traversing through each digit
        while (n != 0) 
        {
            d = n % 10;
  
            // if the digit is present
            // more than once in the
            // number
            if (a.contains(d))
  
                // return 0 if the number
                // has repeated digit
                return 0;
            a.add(d);
            n /= 10;
        }
  
        // return 1 if the number has no
        // repeated digit
        return 1;
    }
  
    // Function to pre calculate
    // the Prefix array
    static void pre_calculations() 
    {
        Prefix.add(0);
        Prefix.add(repeated_digit(1));
  
        // Traversing through the numbers
        // from 2 to MAX
        for (int i = 2; i < MAX + 1; i++)
  
            // Generating the Prefix array
            Prefix.add(repeated_digit(i) + Prefix.elementAt(i - 1));
    }
  
    // Calclute Function
    static int calculate(int L, int R)
    {
  
        // Answer
        return Prefix.elementAt(R) - Prefix.elementAt(L - 1);
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int L = 1, R = 100;
  
        // Pre-calculating the Prefix array.
        pre_calculations();
  
        // Calling the calculate function
        // to find the total number of number
        // which has no repeated digit
        System.out.println(calculate(L, R));
    }
}
  
// This code is contributed by
// sanjeev2552

Python3

# Python implementation of 
# above idea
  
# Prefix Array
Prefix = [0]
  
# Function to check if 
# the given number has 
# repeated digit or not 
def repeated_digit(n):
    a = []
      
    # Traversing through each digit
    while n != 0:
        d = n%10
          
        # if the digit is present
        # more than once in the
        # number
        if d in a:
              
            # return 0 if the number
            # has repeated digit
            return 0
        a.append(d)
        n = n//10
      
    # return 1 if the number has no
    # repeated digit
    return 1
  
# Function to pre calculate
# the Prefix array
def pre_calculation(MAX):
      
    # To use to global Prefix array
    global Prefix
    Prefix.append(repeated_digit(1))
      
    # Traversing through the numbers
    # from 2 to MAX
    for i in range(2,MAX+1):
          
        # Generating the Prefix array 
        Prefix.append( repeated_digit(i) +
                       Prefix[i-1] )
  
# Calclute Function
def calculate(L,R):
      
    # Answer
    return Prefix[R]-Prefix[L-1]
  
  
# Driver Code
  
# Maximum 
MAX = 1000
  
# Pre-calculating the Prefix array.
pre_calculation(MAX)
  
# Range
L=1
R=100
  
# Calling the calculate function
# to find the total number of number
# which has no repeated digit
print(calculate(L, R))

C#

// C# implementation of above idea
using System;
using System.Collections.Generic;
  
class GFG 
{
  
    // Maximum
    static int MAX = 100;
  
    // Prefix Array
    static List Prefix = new List();
  
    // Function to check if the given
    // number has repeated digit or not
    static int repeated_digit(int n)
    {
        HashSet a = new HashSet();
        int d;
  
        // Traversing through each digit
        while (n != 0) 
        {
            d = n % 10;
  
            // if the digit is present
            // more than once in the
            // number
            if (a.Contains(d))
  
                // return 0 if the number
                // has repeated digit
                return 0;
            a.Add(d);
            n /= 10;
        }
  
        // return 1 if the number has no
        // repeated digit
        return 1;
    }
  
    // Function to pre calculate
    // the Prefix array
    static void pre_calculations() 
    {
        Prefix.Add(0);
        Prefix.Add(repeated_digit(1));
  
        // Traversing through the numbers
        // from 2 to MAX
        for (int i = 2; i < MAX + 1; i++)
  
            // Generating the Prefix array
            Prefix.Add(repeated_digit(i) + 
                           Prefix[i - 1]);
    }
  
    // Calclute Function
    static int calculate(int L, int R)
    {
  
        // Answer
        return Prefix[R] - Prefix[L - 1];
    }
  
    // Driver Code
    public static void Main(String[] args)
    {
        int L = 1, R = 100;
  
        // Pre-calculating the Prefix array.
        pre_calculations();
  
        // Calling the calculate function
        // to find the total number of number
        // which has no repeated digit
        Console.WriteLine(calculate(L, R));
    }
}
  
// This code is contributed by 29AjayKumar
输出:
90