Dado un rango, encuentre el total de tales números en el rango dado de modo que no tengan dígitos repetidos.
Por ejemplo:
12 no tiene dígito repetido.
22 tiene dígito repetido.
102, 194 y 213 no tienen dígito repetido.
212, 171 y 4004 tienen dígitos repetidos.
Ejemplos:
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
Fuerza bruta
Recorreremos cada elemento en el rango dado y contaremos el número de dígitos que no tienen dígitos repetidos.
C++
// C++ implementation of brute // force solution. #include <bits/stdc++.h> using namespace std; // Function to check if the given // number has repeated digit or not int repeated_digit(int n) { unordered_set<int> 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<Integer> 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<int>(); // 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
<?php // PHP implementation of // brute force solution. // Function to check if // the given number has // repeated digit or not function repeated_digit($n) { $c = 10; $a = array_fill(0, $c, 0); // Traversing through // each digit while($n > 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 ?>
Producción:
90
Este método responderá cada consulta en tiempo O(N) .
Enfoque eficiente
Calcularemos una array de prefijos de los números que no tienen dígitos repetidos.
= Total number with no repeated digit less than or equal to 1.
Por lo tanto, cada consulta se puede resolver en tiempo O(1) .
A continuación se muestra la implementación de la idea anterior.
C++
// C++ implementation of above idea #include <bits/stdc++.h> using namespace std; // Maximum int MAX = 1000; // Prefix Array vector<int> Prefix = {0}; // Function to check if the given // number has repeated digit or not int repeated_digit(int n) { unordered_set<int> 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<Integer> Prefix = new Vector<>(); // Function to check if the given // number has repeated digit or not static int repeated_digit(int n) { HashSet<Integer> 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<int> Prefix = new List<int>(); // Function to check if the given // number has repeated digit or not static int repeated_digit(int n) { HashSet<int> a = new HashSet<int>(); 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
JavaScript
<script> // JavaScript implementation of brute // force solution. // Function to check if the given // number has repeated digit or not function repeated_digit(n){ const s = new Set(); // Traversing through each digit while(n != 0){ let d = n % 10; // if the digit is present // more than once in the // number if(s.has(d)){ // return 0 if the number // has repeated digit return 0; } s.add(d); n = Math.floor(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){ let answer = 0; // Traversing through the range for(let 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 { let L = 1, R = 100; // Calling the calculate console.log(calculate(L, R)); } // This code is contributed by Gautam goel (gautamgoel962) </script>
Producción:
90