给定两个整数N和M以及一个2D数组arr [] ,任务是构造N个数字(不带前导零)的最小可能整数,以使从左数第arr [i] [0]个数字为arr [i ] [1] 。如果不可能构造任何这样的整数,请打印“ No” 。否则,请打印该号码。
例子:
Input : N = 3, arr[]={{0, 7}, {2, 2}}
Output: 702
Explanation: According to the conditions, the 1st And 3rd digit should be equal to 7 and 2. The number should be of the form 7_2. Therefore, the minimum integer possible is 702.
Input : N = 3, arr[]={{1, 1}, {1, 3}}
Output: No
天真的方法:由于数字始终是0到9 ,因此最简单的方法是根据给定条件放置数字,以检查每个大于0且小于10 N的整数的组合。
下面是上述方法的实现:
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to check if num satisfies the
// arrangement specified by the vector A
bool check(int num, int N, int M,
vector >& A)
{
// Convert num to equivalent string
string temp = to_string(num);
// If the number of digits
// is not equal to N
if (temp.size() != N) {
return false;
}
// Iterate over the vector A
for (int i = 0; i < M; i++) {
// If the digit at A[i].first position
// not the same as A[i].second
if (temp[A[i].first] != A[i].second) {
return false;
}
}
return true;
}
// Function to find the smallest integer
// satisfying the given conditions
void find_num(int N, vector >& A)
{
int ans = -1;
// Check for every combination upto 10^N
for (int i = 0; i < pow(10, N); i++) {
// If condition satisfies
if (check(i, N, A.size(), A)) {
ans = i;
break;
}
}
if (ans == -1)
cout << "No";
else
cout << ans;
}
// Driver Code
int main()
{
int N = 3;
vector > A
= { { 0, '7' }, { 2, '2' }, { 0, '7' } };
find_num(N, A);
}
Java
// Java program to implement
// the above approach
import java.util.*;
class GFG{
static class pair
{
int first;
char second;
public pair(int first, char second)
{
this.first = first;
this.second = second;
}
};
// Function to check if num satisfies the
// arrangement specified by the vector A
static boolean check(int num, int N, int M,
Vector A)
{
// Convert num to equivalent String
String temp = String.valueOf(num);
// If the number of digits
// is not equal to N
if (temp.length() != N) {
return false;
}
// Iterate over the vector A
for (int i = 0; i < M; i++) {
// If the digit at A[i].first position
// not the same as A[i].second
if (temp.charAt(A.get(i).first) != A.get(i).second) {
return false;
}
}
return true;
}
// Function to find the smallest integer
// satisfying the given conditions
static void find_num(int N, Vector A)
{
int ans = -1;
// Check for every combination upto 10^N
for (int i = 0; i < Math.pow(10, N); i++) {
// If condition satisfies
if (check(i, N, A.size(), A)) {
ans = i;
break;
}
}
if (ans == -1)
System.out.print("No");
else
System.out.print(ans);
}
// Driver Code
public static void main(String[] args)
{
int N = 3;
Vector A = new Vector<>();
A.add(new pair(0, '7' ));
A.add(new pair(2, '2'));
A.add(new pair( 0, '7'));
find_num(N, A);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program to implement
# the above approach
# Function to check if num satisfies the
# arrangement specified by the vector A
def check(num, N, M, A) :
# Convert num to equivalent string
temp = str(num)
# If the number of digits
# is not equal to N
if (len(temp) != N) :
return False
# Iterate over the vector A
for i in range(M) :
# If the digit at A[i].first position
# not the same as A[i].second
if (temp[A[i][0]] != A[i][1]) :
return False
return True
# Function to find the smallest integer
# satisfying the given conditions
def find_num(N, A) :
ans = -1
# Check for every combination upto 10^N
for i in range(pow(10, N)) :
# If condition satisfies
if (check(i, N, len(A), A)) :
ans = i
break
if (ans == -1) :
print("No")
else :
print(ans)
N = 3
A = [ [ 0, '7' ], [ 2, '2' ], [ 0, '7' ] ]
find_num(N, A)
# This code is contributed by divyesh072019
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{
public class pair
{
public int first;
public char second;
public pair(int first, char second)
{
this.first = first;
this.second = second;
}
};
// Function to check if num satisfies the
// arrangement specified by the vector A
static bool check(int num, int N, int M,
List A)
{
// Convert num to equivalent String
String temp = String.Join("",num);
// If the number of digits
// is not equal to N
if (temp.Length != N) {
return false;
}
// Iterate over the vector A
for (int i = 0; i < M; i++) {
// If the digit at A[i].first position
// not the same as A[i].second
if (temp[A[i].first] != A[i].second) {
return false;
}
}
return true;
}
// Function to find the smallest integer
// satisfying the given conditions
static void find_num(int N, List A)
{
int ans = -1;
// Check for every combination upto 10^N
for (int i = 0; i < Math.Pow(10, N); i++) {
// If condition satisfies
if (check(i, N, A.Count, A)) {
ans = i;
break;
}
}
if (ans == -1)
Console.Write("No");
else
Console.Write(ans);
}
// Driver Code
public static void Main(String[] args)
{
int N = 3;
List A = new List();
A.Add(new pair(0, '7' ));
A.Add(new pair(2, '2'));
A.Add(new pair( 0, '7'));
find_num(N, A);
}
}
// This code is contributed by shikhasingrajput
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to find the smallest integer
// satisfying the given conditions
void find_num(int N, vector >& A)
{
// Stores the digits at their
// respective positions
map mp;
// Traverse the array
for (int i = 0; i < A.size(); i++) {
// If first digit required
// to be placed is 0
if (N > 1 and A[i].first == 0
and A[i].second == 0) {
// Not possible
cout << "No";
return;
}
// If multiple numbers are assigned
// to be placed in a single position
if (mp.find(A[i].first) != mp.end()
and mp[A[i].first] != A[i].second) {
// Not possible
cout << "No";
return;
}
// Assign the digits to their
// respective positions
mp[A[i].first] = A[i].second;
}
// Stores the result
string ans = "";
// Trverse for all N digits
for (int i = 0; i < N; i++) {
// For the first position
if (N > 1 and i == 0) {
// If digit is assigned
// to the position
if (mp.find(0) != mp.end()) {
ans += to_string(mp[0]);
}
// Otherwise
else {
ans += to_string(1);
}
}
else {
// Add it to answer
ans += to_string(mp[i]);
}
}
cout << ans << "\n";
}
// Driver Code
int main()
{
int N = 3;
vector > A
= { { 0, 7 }, { 2, 2 }, { 0, 7 } };
find_num(N, A);
}
Java
// Java program to implement
// the above approach
import java.util.*;
class GFG{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to find the smallest integer
// satisfying the given conditions
static void find_num(int N, pair []A)
{
// Stores the digits at their
// respective positions
HashMap mp = new HashMap();
// Traverse the array
for(int i = 0; i < A.length; i++)
{
// If first digit required
// to be placed is 0
if (N > 1 && A[i].first == 0 &&
A[i].second == 0)
{
// Not possible
System.out.print("No");
return;
}
// If multiple numbers are assigned
// to be placed in a single position
if (mp.containsKey(A[i].first) &&
mp.get(A[i].first) != A[i].second)
{
// Not possible
System.out.print("No");
return;
}
// Assign the digits to their
// respective positions
mp.put(A[i].first, A[i].second);
}
// Stores the result
String ans = "";
// Trverse for all N digits
for(int i = 0; i < N; i++)
{
// For the first position
if (N > 1 && i == 0)
{
// If digit is assigned
// to the position
if (mp.containsKey(0))
{
ans += String.valueOf(mp.get(0));
}
// Otherwise
else
{
ans += String.valueOf(1);
}
}
else
{
// Add it to answer
if (mp.get(i) == null)
ans += String.valueOf(0);
else
ans += String.valueOf(mp.get(i));
}
}
System.out.print(ans + "\n");
}
// Driver Code
public static void main(String[] args)
{
int N = 3;
pair []A = { new pair(0, 7),
new pair(2, 2),
new pair(0, 7)};
find_num(N, A);
}
}
// This code is contributed by Amit Katiyar
Python3
# Python3 program to implement
# the above approach
# Function to find the smallest integer
# satisfying the given conditions
def find_num(N, A) :
# Stores the digits at their
# respective positions
mp = {}
# Traverse the array
for i in range(len(A)) :
# If first digit required
# to be placed is 0
if ((N > 1) and (A[i][0] == 0) and (A[i][1] == 0)) :
# Not possible
print("No")
return
# If multiple numbers are assigned
# to be placed in a single position
if ((A[i][0] in mp) and (mp[A[i][0]] != A[i][1])) :
# Not possible
print("No")
return
# Assign the digits to their
# respective positions
mp[A[i][0]] = A[i][1]
# Stores the result
ans = ""
# Trverse for all N digits
for i in range(N) :
# For the first position
if (N > 1 and i == 0) :
# If digit is assigned
# to the position
if (0 in mp) :
ans = ans + str(mp[0])
# Otherwise
else :
ans = ans + str(1)
else :
# Add it to answer
if i in mp :
ans = ans + str(mp[i])
else :
ans = ans + str(0)
print(ans)
# Driver code
N = 3
A = [ [ 0, 7 ], [ 2, 2 ], [ 0, 7 ] ]
find_num(N, A)
# This code is contributed by divyesh072019
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{
public
class pair
{
public
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to find the smallest integer
// satisfying the given conditions
static void find_num(int N, pair []A)
{
// Stores the digits at their
// respective positions
Dictionary mp = new Dictionary();
// Traverse the array
for(int i = 0; i < A.Length; i++)
{
// If first digit required
// to be placed is 0
if (N > 1 && A[i].first == 0 &&
A[i].second == 0)
{
// Not possible
Console.Write("No");
return;
}
// If multiple numbers are assigned
// to be placed in a single position
if (mp.ContainsKey(A[i].first) &&
mp[A[i].first] != A[i].second)
{
// Not possible
Console.Write("No");
return;
}
// Assign the digits to their
// respective positions
if(mp.ContainsKey(A[i].first))
mp[A[i].first] = A[i].second;
else
mp.Add(A[i].first, A[i].second);
}
// Stores the result
String ans = "";
// Trverse for all N digits
for(int i = 0; i < N; i++)
{
// For the first position
if (N > 1 && i == 0)
{
// If digit is assigned
// to the position
if (mp.ContainsKey(0))
{
ans += String.Join("", mp[0]);
}
// Otherwise
else
{
ans += String.Join("", 1);
}
}
else
{
// Add it to answer
if ( ! mp.ContainsKey(i) )
ans += String.Join("", 0);
else
ans += String.Join("", mp[i]);
}
}
Console.Write(ans + "\n");
}
// Driver Code
public static void Main(String[] args)
{
int N = 3;
pair []A = { new pair(0, 7),
new pair(2, 2),
new pair(0, 7)};
find_num(N, A);
}
}
// This code is contributed by 29AjayKumar
输出:
702
时间复杂度: O(10 N * M)
辅助空间: O(N)
高效方法:请按照以下步骤解决问题:
- 初始化一个地图,例如mp ,以将数字分配给相应的位置。
- 如果需要放置的第一位数字为0 ,则打印“否”,因为该数字不能包含前导零。
- 遍历数组arr []并将数字插入Map中的相应索引处。
- 运行从1到N的循环,并为每个i检查是否将数字分配给Map中的第i个位置。如果存在于地图中,则将其添加到答案中。
下面是上述方法的实现:
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to find the smallest integer
// satisfying the given conditions
void find_num(int N, vector >& A)
{
// Stores the digits at their
// respective positions
map mp;
// Traverse the array
for (int i = 0; i < A.size(); i++) {
// If first digit required
// to be placed is 0
if (N > 1 and A[i].first == 0
and A[i].second == 0) {
// Not possible
cout << "No";
return;
}
// If multiple numbers are assigned
// to be placed in a single position
if (mp.find(A[i].first) != mp.end()
and mp[A[i].first] != A[i].second) {
// Not possible
cout << "No";
return;
}
// Assign the digits to their
// respective positions
mp[A[i].first] = A[i].second;
}
// Stores the result
string ans = "";
// Trverse for all N digits
for (int i = 0; i < N; i++) {
// For the first position
if (N > 1 and i == 0) {
// If digit is assigned
// to the position
if (mp.find(0) != mp.end()) {
ans += to_string(mp[0]);
}
// Otherwise
else {
ans += to_string(1);
}
}
else {
// Add it to answer
ans += to_string(mp[i]);
}
}
cout << ans << "\n";
}
// Driver Code
int main()
{
int N = 3;
vector > A
= { { 0, 7 }, { 2, 2 }, { 0, 7 } };
find_num(N, A);
}
Java
// Java program to implement
// the above approach
import java.util.*;
class GFG{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to find the smallest integer
// satisfying the given conditions
static void find_num(int N, pair []A)
{
// Stores the digits at their
// respective positions
HashMap mp = new HashMap();
// Traverse the array
for(int i = 0; i < A.length; i++)
{
// If first digit required
// to be placed is 0
if (N > 1 && A[i].first == 0 &&
A[i].second == 0)
{
// Not possible
System.out.print("No");
return;
}
// If multiple numbers are assigned
// to be placed in a single position
if (mp.containsKey(A[i].first) &&
mp.get(A[i].first) != A[i].second)
{
// Not possible
System.out.print("No");
return;
}
// Assign the digits to their
// respective positions
mp.put(A[i].first, A[i].second);
}
// Stores the result
String ans = "";
// Trverse for all N digits
for(int i = 0; i < N; i++)
{
// For the first position
if (N > 1 && i == 0)
{
// If digit is assigned
// to the position
if (mp.containsKey(0))
{
ans += String.valueOf(mp.get(0));
}
// Otherwise
else
{
ans += String.valueOf(1);
}
}
else
{
// Add it to answer
if (mp.get(i) == null)
ans += String.valueOf(0);
else
ans += String.valueOf(mp.get(i));
}
}
System.out.print(ans + "\n");
}
// Driver Code
public static void main(String[] args)
{
int N = 3;
pair []A = { new pair(0, 7),
new pair(2, 2),
new pair(0, 7)};
find_num(N, A);
}
}
// This code is contributed by Amit Katiyar
Python3
# Python3 program to implement
# the above approach
# Function to find the smallest integer
# satisfying the given conditions
def find_num(N, A) :
# Stores the digits at their
# respective positions
mp = {}
# Traverse the array
for i in range(len(A)) :
# If first digit required
# to be placed is 0
if ((N > 1) and (A[i][0] == 0) and (A[i][1] == 0)) :
# Not possible
print("No")
return
# If multiple numbers are assigned
# to be placed in a single position
if ((A[i][0] in mp) and (mp[A[i][0]] != A[i][1])) :
# Not possible
print("No")
return
# Assign the digits to their
# respective positions
mp[A[i][0]] = A[i][1]
# Stores the result
ans = ""
# Trverse for all N digits
for i in range(N) :
# For the first position
if (N > 1 and i == 0) :
# If digit is assigned
# to the position
if (0 in mp) :
ans = ans + str(mp[0])
# Otherwise
else :
ans = ans + str(1)
else :
# Add it to answer
if i in mp :
ans = ans + str(mp[i])
else :
ans = ans + str(0)
print(ans)
# Driver code
N = 3
A = [ [ 0, 7 ], [ 2, 2 ], [ 0, 7 ] ]
find_num(N, A)
# This code is contributed by divyesh072019
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{
public
class pair
{
public
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to find the smallest integer
// satisfying the given conditions
static void find_num(int N, pair []A)
{
// Stores the digits at their
// respective positions
Dictionary mp = new Dictionary();
// Traverse the array
for(int i = 0; i < A.Length; i++)
{
// If first digit required
// to be placed is 0
if (N > 1 && A[i].first == 0 &&
A[i].second == 0)
{
// Not possible
Console.Write("No");
return;
}
// If multiple numbers are assigned
// to be placed in a single position
if (mp.ContainsKey(A[i].first) &&
mp[A[i].first] != A[i].second)
{
// Not possible
Console.Write("No");
return;
}
// Assign the digits to their
// respective positions
if(mp.ContainsKey(A[i].first))
mp[A[i].first] = A[i].second;
else
mp.Add(A[i].first, A[i].second);
}
// Stores the result
String ans = "";
// Trverse for all N digits
for(int i = 0; i < N; i++)
{
// For the first position
if (N > 1 && i == 0)
{
// If digit is assigned
// to the position
if (mp.ContainsKey(0))
{
ans += String.Join("", mp[0]);
}
// Otherwise
else
{
ans += String.Join("", 1);
}
}
else
{
// Add it to answer
if ( ! mp.ContainsKey(i) )
ans += String.Join("", 0);
else
ans += String.Join("", mp[i]);
}
}
Console.Write(ans + "\n");
}
// Driver Code
public static void Main(String[] args)
{
int N = 3;
pair []A = { new pair(0, 7),
new pair(2, 2),
new pair(0, 7)};
find_num(N, A);
}
}
// This code is contributed by 29AjayKumar
输出:
702
时间复杂度: O(N + M)
辅助空间: O(N)