给定两个正整数A , B和一个仅由数字[0-9 ]组成的数组D[] ,任务是检查是否可以通过重复除以存在的任何因子来将A减少到B数组d []或通过去除其任何数字第一次出现的,其存在于所述阵列d []。
例子:
Input: A = 5643, B = 81, D[] = {3, 8, 1}
Output: Yes
Explanation:
Operation 1: Divide A (= 5643) by 3, then the value of A becomes 1881.
Operation 2: Remove the first occurrence of 8 from A(= 1881), then the value of A becomes 181.
Operation 3: Remove the first occurrence of 1 from A(= 181), then the value of A becomes 81.
Input: A = 82, B = 2, D[] = {8, 2}
Output: Yes
方法:给定的问题可以通过使用队列,并检查是否在任何步骤A修改的到B或不是值上的值A执行所有可能的操作来解决。请按照以下步骤解决问题:
- 初始化一个队列,比如Q并最初将A推送到它。
- 初始化一个HashMap,写成M存储在队列中存在Q中的元素和初始化一个变量,ANS为“否”来存储所需要的结果。
- 迭代直到Q不为空,执行以下步骤:
- 将Q的前面存储在变量top 中。
- 如果top的值等于B ,则将ans的值更新为“Yes”并跳出循环。
- 否则,遍历数组D[]并对每个元素D[i]检查两个条件:
- 如果D[i]是top 的一个因子,则将top除以D[i]得到的商值推入队列Q 中,并将其标记为M 中的访问过。
- 如果D[i]出现在数字top 中,则删除它的第一次出现并推送在队列Q 中获得的新数字,并将其标记为在M 中访问过。
- 完成以上步骤后,打印ans的值作为结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to check if a digit x is
// present in the number N or not
int isPresent(int n, int x)
{
// Convert N to string
string num = to_string(n);
// Traverse the string num
for (int i = 0; i < num.size();
i++) {
// Return first occurrence
// of the digit x
if ((num[i] - '0') == x)
return i;
}
return -1;
}
// Function to remove the character
// at a given index from the number
int removeDigit(int n, int index)
{
// Convert N to string
string num = to_string(n);
// Store the resultant string
string ans = "";
// Traverse the string num
for (int i = 0;
i < num.size(); i++) {
if (i != index)
ans += num[i];
}
// If the number becomes empty
// after deletion, then return -1
if (ans == "" || (ans.size() == 1
&& ans[0] == '0'))
return -1;
// Return the number
int x = stoi(ans);
return x;
}
// Function to check if A can be
// reduced to B by performing the
// operations any number of times
bool reduceNtoX(int a, int b,
int d[], int n)
{
// Create a queue
queue q;
// Push A into the queue
q.push(a);
// Hashmap to check if the element
// is present in the Queue or not
unordered_map visited;
// Set A as visited
visited[a] = true;
// Iterate while the queue is not empty
while (!q.empty()) {
// Store the front value of the
// queue and pop it from it
int top = q.front();
q.pop();
if (top < 0)
continue;
// If top is equal to B,
// then return true
if (top == b)
return true;
// Traverse the array, D[]
for (int i = 0; i < n; i++) {
// Divide top by D[i] if
// it is possible and
// push the result in q
if (d[i] != 0 && top % d[i] == 0
&& !visited[top / d[i]]) {
q.push(top / d[i]);
visited[top / d[i]] = true;
}
// If D[i] is present at the top
int index = isPresent(top, d[i]);
if (index != -1) {
// Remove the first occurrence
// of D[i] from the top and
// store the new number
int newElement
= removeDigit(top, index);
// Push newElement into the queue q
if (newElement != -1
&& (!visited[newElement])) {
q.push(newElement);
visited[newElement] = true;
}
}
}
}
// Return false if A can
// not be reduced to B
return false;
}
// Driver Code
int main()
{
int A = 5643, B = 81;
int D[] = { 3, 8, 1 };
int N = sizeof(D) / sizeof(D[0]);
if (reduceNtoX(A, B, D, N))
cout << "Yes";
else
cout << "No";
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG
{
// Function to check if a digit x is
// present in the number N or not
static int isPresent(int n, int x)
{
// Convert N to string
String num = String.valueOf(n);
// Traverse the string num
for (int i = 0; i < num.length();
i++) {
// Return first occurrence
// of the digit x
if ((num.charAt(i) - '0') == x)
return i;
}
return -1;
}
// Function to remove the character
// at a given index from the number
static int removeDigit(int n, int index)
{
// Convert N to string
String num = String.valueOf(n);
// Store the resultant string
String ans = "";
// Traverse the string num
for (int i = 0;
i < num.length(); i++)
{
if (i != index)
ans += num.charAt(i);
}
// If the number becomes empty
// after deletion, then return -1
if (ans == "" || (ans.length() == 1
&& ans.charAt(0) == '0'))
return -1;
// Return the number
int x = Integer.valueOf(ans);
return x;
}
// Function to check if A can be
// reduced to B by performing the
// operations any number of times
static boolean reduceNtoX(int a, int b,
int d[], int n)
{
// Create a queue
Queue q=new LinkedList<>();
// Push A into the queue
q.add(a);
// Hashmap to check if the element
// is present in the Queue or not
Map visited= new HashMap<>();
// Set A as visited
visited.put(a,true);
// Iterate while the queue is not empty
while (!q.isEmpty()) {
// Store the front value of the
// queue and pop it from it
int top = q.peek();
q.poll();
if (top < 0)
continue;
// If top is equal to B,
// then return true
if (top == b)
return true;
// Traverse the array, D[]
for (int i = 0; i < n; i++) {
// Divide top by D[i] if
// it is possible and
// push the result in q
if (d[i] != 0 && top % d[i] == 0
&& !visited.getOrDefault(top / d[i], false)) {
q.add(top / d[i]);
visited.put(top / d[i], true);
}
// If D[i] is present at the top
int index = isPresent(top, d[i]);
if (index != -1) {
// Remove the first occurrence
// of D[i] from the top and
// store the new number
int newElement
= removeDigit(top, index);
// Push newElement into the queue q
if (newElement != -1
&& (!visited.getOrDefault(newElement,false))) {
q.add(newElement);
visited.put(newElement, true);
}
}
}
}
// Return false if A can
// not be reduced to B
return false;
}
// Driver code
public static void main (String[] args)
{
// Given inputs
int A = 5643, B = 81;
int D[] = { 3, 8, 1 };
int N = D.length;
if (reduceNtoX(A, B, D, N))
System.out.println("Yes");
else
System.out.println("No");
}
}
// This code is contributed by offbeat
Python3
# Python3 program for the above approach
from collections import deque
# Function to check if a digit x is
# present in the number N or not
def isPresent(n, x):
# Convert N to string
num = str(n)
# Traverse the num
for i in range(len(num)):
# Return first occurrence
# of the digit x
if ((ord(num[i]) - ord('0')) == x):
return i
return -1
# Function to remove the character
# at a given index from the number
def removeDigit(n, index):
# Convert N to string
num = str(n)
# Store the resultant string
ans = ""
# Traverse the num
for i in range(len(num)):
if (i != index):
ans += num[i]
# If the number becomes empty
# after deletion, then return -1
if (ans == "" or (len(ans) == 1 and
ans[0] == '0')):
return -1
# Return the number
x = int(ans)
return x
# Function to check if A can be
# reduced to B by performing the
# operations any number of times
def reduceNtoX(a, b, d, n):
# Create a queue
q = deque()
# Push A into the queue
q.append(a)
# Hashmap to check if the element
# is present in the Queue or not
visited = {}
# Set A as visited
visited[a] = True
# Iterate while the queue is not empty
while (len(q) > 0):
# Store the front value of the
# queue and pop it from it
top = q.popleft()
if (top < 0):
continue
# If top is equal to B,
# then return true
if (top == b):
return True
# Traverse the array, D[]
for i in range(n):
# Divide top by D[i] if
# it is possible and
# push the result in q
if (d[i] != 0 and top % d[i] == 0 and
(top // d[i] not in visited)):
q.append(top // d[i])
visited[top // d[i]] = True
# If D[i] is present at the top
index = isPresent(top, d[i])
if (index != -1):
# Remove the first occurrence
# of D[i] from the top and
# store the new number
newElement = removeDigit(top, index)
# Push newElement into the queue q
if (newElement != -1 and
(newElement not in visited)):
q.append(newElement)
visited[newElement] = True
# Return false if A can
# not be reduced to B
return False
# Driver Code
if __name__ == '__main__':
A, B = 5643, 81
D = [ 3, 8, 1 ]
N = len(D)
if (reduceNtoX(A, B, D, N)):
print("Yes")
else:
print("No")
# This code is contributed by mohit kumar 29
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG{
// Function to check if a digit x is
// present in the number N or not
static int isPresent(int n, int x)
{
// Convert N to string
string num = n.ToString();
// Traverse the string num
for (int i = 0; i < num.Length;
i++) {
// Return first occurrence
// of the digit x
if (((int)num[i] - 97) == x)
return i;
}
return -1;
}
// Function to remove the character
// at a given index from the number
static int removeDigit(int n, int index)
{
// Convert N to string
string num = n.ToString();
// Store the resultant string
string ans = "";
// Traverse the string num
for (int i = 0;
i < num.Length; i++) {
if (i != index)
ans += num[i];
}
// If the number becomes empty
// after deletion, then return -1
if (ans == "" || (ans.Length == 1
&& ans[0] == '0'))
return -1;
// Return the number
int x = Int32.Parse(ans);;
return x;
}
// Function to check if A can be
// reduced to B by performing the
// operations any number of times
static bool reduceNtoX(int a, int b,
int []d, int n)
{
// Create a queue
Queue q = new Queue();
// Push A into the queue
q.Enqueue(a);
// Hashmap to check if the element
// is present in the Queue or not
Dictionary visited = new Dictionary();
// Set A as visited
visited[a] = true;
// Iterate while the queue is not empty
while (q.Count>0) {
// Store the front value of the
// queue and pop it from it
int top = q.Peek();
q.Dequeue();
if (top < 0)
continue;
// If top is equal to B,
// then return true
if (top == b)
return true;
// Traverse the array, D[]
for (int i = 0; i < n; i++) {
// Divide top by D[i] if
// it is possible and
// push the result in q
if (d[i] != 0 && top % d[i] == 0 &&
visited.ContainsKey(top / d[i]) && visited[top / d[i]]==false) {
q.Enqueue(top / d[i]);
visited[top / d[i]] = true;
}
// If D[i] is present at the top
int index = isPresent(top, d[i]);
if (index != -1) {
// Remove the first occurrence
// of D[i] from the top and
// store the new number
int newElement = removeDigit(top, index);
// Push newElement into the queue q
if (newElement != -1 && (visited.ContainsKey(newElement) && visited[newElement]==false)) {
q.Enqueue(newElement);
visited[newElement] = true;
}
}
}
}
// Return false if A can
// not be reduced to B
return true;
}
// Driver Code
public static void Main()
{
int A = 5643, B = 81;
int []D = { 3, 8, 1 };
int N = D.Length;
if (reduceNtoX(A, B, D, N))
Console.Write("Yes");
else
Console.Write("No");
}
}
// This code is contributed by SURENDRA_GANGWAR.
输出:
Yes
时间复杂度: O(2 N )
辅助空间: O(2 N )