给定一个整数X和一个字符串数组str ,该数组表示范围为[2,36]的任意基数的数字,任务是检查是否可以通过为每个字符串指定2至36的所需基数来将所有字符串都转换为X,这样该字符串的十进制基数等效为X。
例子:
Input: str = {10000, 20, 16}, X = 16
Output: Yes
Explanation:
Every number in array is equal to 16 when converted to Decimal base, if following bases are selected:
(10000)2 = (16)10
(20)8 = (16)10
(16)10 = (16)10
Input: str = {10100, 5A, 1011010}, X = 90
Output: Yes
Every number in array is equal to 90 when converted to Decimal base, if following bases are selected:
(10100)3 = (90)10
(5A)16 = (90)10
(1011010)2 = (90)10
方法:想法是通过将数组的每个数字分配为2到36的基数,将其转换为十进制基数,然后检查每个转换后的数字是否等于X。
下面介绍了上述方法的分步算法–
- 将计数初始化为0,以检查转换后等于X的数字计数。
- 运行循环以遍历数组的数字,然后遍历每个数字–
- 运行另一个从2到36的循环,为数字指定基数,然后找到该数字的十进制等效项。
- 如果该数字的十进制等效项等于X,则将计数加1并中断循环,以便不为该数字分配任何其他基数。
- 如果可转换为X的数字的计数等于数组的长度,则该数组可以对应于数字X。
下面是上述方法的实现:
C++
// C++ implementation to check
// wheather array of strings
// can correspond to a number X
#include
using namespace std;
// Function to find the maximum
// base possible for the number N
int val(char c)
{
if (c >= '0' && c <= '9')
return (int)c - '0';
else
return (int)c - 'A' + 10;
}
// Function to find the decimal
// equivalent of the number
int toDeci(string str, int base)
{
int len = str.size();
int power = 1;
int num = 0;
int i;
for (i = len - 1; i >= 0; i--) {
// Condition to check if the
// number is convertible
// to another base
if (val(str[i]) >= base) {
return -1;
}
num += val(str[i]) * power;
power = power * base;
}
return num;
}
// Function to check that the
// array can correspond to a number X
void checkCorrespond(vector str,
int x){
// counter to count the numbers
// those are convertible to X
int counter = 0;
int n = str.size();
// Loop to iterate over the array
for (int i = 0; i < n; i++) {
for (int j = 2; j <= 36; j++) {
// Convert the current string
// to every base for checking
// whether it will correspond
// to X from any base
if (toDeci(str[i], j) == x) {
counter++;
break;
}
}
}
// Condition to check if every
// number of the array can
// be converted to X
if (counter == n)
cout << "YES"
<< "\n";
else
cout << "NO"
<< "\n";
}
// Driver Code
int main()
{
int x = 16;
// The set of strings
// in base from [2, 36]
vector str =
{ "10000", "20", "16" };
checkCorrespond(str, x);
return 0;
}
Java
// Java implementation to check
// wheather array of Strings
// can correspond to a number X
class GFG{
// Function to find the maximum
// base possible for the number N
static int val(char c)
{
if (c >= '0' && c <= '9')
return (int)c - '0';
else
return (int)c - 'A' + 10;
}
// Function to find the decimal
// equivalent of the number
static int toDeci(String str, int base)
{
int len = str.length();
int power = 1;
int num = 0;
int i;
for (i = len - 1; i >= 0; i--) {
// Condition to check if the
// number is convertible
// to another base
if (val(str.charAt(i)) >= base) {
return -1;
}
num += val(str.charAt(i)) * power;
power = power * base;
}
return num;
}
// Function to check that the
// array can correspond to a number X
static void checkCorrespond(String[] str,
int x){
// counter to count the numbers
// those are convertible to X
int counter = 0;
int n = str.length;
// Loop to iterate over the array
for (int i = 0; i < n; i++) {
for (int j = 2; j <= 36; j++) {
// Convert the current String
// to every base for checking
// whether it will correspond
// to X from any base
if (toDeci(str[i], j) == x) {
counter++;
break;
}
}
}
// Condition to check if every
// number of the array can
// be converted to X
if (counter == n)
System.out.print("YES"
+ "\n");
else
System.out.print("NO"
+ "\n");
}
// Driver Code
public static void main(String[] args)
{
int x = 16;
// The set of Strings
// in base from [2, 36]
String[] str =
{ "10000", "20", "16" };
checkCorrespond(str, x);
}
}
// This code contributed by PrinciRaj1992
Python3
# Python3 implementation to check
# wheather array of strrings
# can correspond to a number X
# Function to find the maximum
# base possible for the number N
def val(c):
if (c >= '0' and c <= '9'):
return int(c)
else:
return c - 'A' + 10
# Function to find the decimal
# equivalennt of the number
def toDeci(strr, base):
lenn = len(strr)
power = 1
num = 0
for i in range(lenn - 1, -1, -1):
# Condition to check if the
# number is convertible
# to another base
if (val(strr[i]) >= base):
return -1
num += val(strr[i]) * power
power = power * base
return num
# Function to check that the
# array can correspond to a number X
def checkCorrespond(strr, x):
# counter to count the numbers
# those are convertible to X
counter = 0
n = len(strr)
# Loop to iterate over the array
for i in range(n):
for j in range(2,37):
# Convert the current strring
# to every base for checking
# whether it will correspond
# to X from any base
if (toDeci(strr[i], j) == x):
counter += 1
break
# Condition to check if every
# number of the array can
# be converted to X
if (counter == n):
print("YES")
else:
print("NO")
# Driver Code
x = 16
# The set of strrings
# in base from [2, 36]
strr = ["10000", "20", "16"]
checkCorrespond(strr, x)
# This code is contributed by shubhamsingh10
C#
// C# implementation to check
// wheather array of Strings
// can correspond to a number X
using System;
class GFG{
// Function to find the maximum
// base possible for the number N
static int val(char c)
{
if (c >= '0' && c <= '9')
return (int)c - '0';
else
return (int)c - 'A' + 10;
}
// Function to find the decimal
// equivalent of the number
static int toDeci(String str, int Base)
{
int len = str.Length;
int power = 1;
int num = 0;
int i;
for (i = len - 1; i >= 0; i--) {
// Condition to check if the
// number is convertible
// to another base
if (val(str[i]) >= Base) {
return -1;
}
num += val(str[i]) * power;
power = power * Base;
}
return num;
}
// Function to check that the
// array can correspond to a number X
static void checkCorrespond(String[] str,
int x){
// counter to count the numbers
// those are convertible to X
int counter = 0;
int n = str.Length;
// Loop to iterate over the array
for (int i = 0; i < n; i++) {
for (int j = 2; j <= 36; j++) {
// Convert the current String
// to every base for checking
// whether it will correspond
// to X from any base
if (toDeci(str[i], j) == x) {
counter++;
break;
}
}
}
// Condition to check if every
// number of the array can
// be converted to X
if (counter == n)
Console.Write("YES"
+ "\n");
else
Console.Write("NO"
+ "\n");
}
// Driver Code
public static void Main(String[] args)
{
int x = 16;
// The set of Strings
// in base from [2, 36]
String[] str =
{ "10000", "20", "16" };
checkCorrespond(str, x);
}
}
// This code is contributed by Princi Singh
输出:
YES
性能分析:
- 时间复杂度: O(N)。
- 辅助空间: O(1)。