使用数字 M 构造 N 的最大计数,其中 2 和 5 相同,6 和 9 相同


最大计数是指可能的最大计数。这里我们给定一个整数 N 和一个整数字符串 M。我们的任务是返回使用整数字符串 M 的数字构造数字 N 的最大计数。同时,我们可以将 2 和 5 视为相同,将 6 和 9 视为相同。

示例

输入 1

N = 29
M = "2569783"
Output 1: 2

说明 − 由于 5 等于 2,6 等于 9,因此我们共有两个“2”和两个“9”。因此,使用字符串 M (2596783) 的数字构造数字 N (29) 的最大计数为 2。

输入 2

N = 999
M = 6666925
Output 2: 1

方法

让我们逐步讨论这种方法:

  • 首先,我们将创建一个函数“maxCountOfN”,该函数将给定的字符串“M”和数字“N”作为参数,并将所需的整数“maxCount”作为返回值。

  • 在函数中,我们将创建一个哈希映射“mp”来存储字符串“M”中每个数字的频率。

  • 我们定义一个变量“len”来存储字符串“M”的大小。

  • 遍历字符串“M”,从索引“i = 0”到小于等于“len”,并在循环中执行以下操作:

    • 如果我们得到一个数字“2”,我们将它转换为“5”。

    • 如果我们得到一个数字“6”,我们将它转换为“9”。

    • 在“mp”映射中计算每个数字的频率,作为字符-整数对。

  • 创建另一个哈希映射“mpN”来存储数字 N 的数字频率。

  • 使用 while 循环遍历数字“N”,直到 N 大于 0,并在循环中执行以下操作:

    • 创建一个整数“rem”来存储数字的最后一位。

    • 检查 rem 是否为 2,如果是,则将其转换为 5。

    • 检查 rem 是否为 6,如果是,则将其转换为 9。

    • 在“mpN”映射中计算每个数字的频率,作为字符-整数对。即,将整数作为字符存储在映射中,如“mpN[rem + ‘0’]”。

    • 将 N 减少到 N%10 以去除数字的最后一位。

  • 我们创建一个变量“maxCount”,其中我们存储“INT_MAX”。

  • 最后,我们遍历映射“mpN”来查找 N 的最大计数,并在循环中执行以下操作:

    • 创建一个变量“key”,其中我们存储数字的数字。

    • 检查 key 是否存在于字符串的映射中,如果不存在,则意味着我们无法使用字符串“M”的数字创建数字“N”,我们返回“0”。

    • 创建一个变量“tempCount”,其中我们存储值(将字符串 M 中数字的频率除以 N 的当前数字的频率)。

    • 在 maxCount 中,我们存储 tempCount 和 maxCount 的最小值,因为只有当数字“N”的每个数字都存在于字符串“M”中时,才有可能构造数字“N”。

  • 返回 maxCount

示例

#include <bits/stdc++.h>
using namespace std;
int maxCountOfN(int N, string M){
   map< char, int >mp; //created hashmap to store the frequency of each digit of //string
   int len = M.size(); // getting the size of the string     
   // iterating string using for loop 
   for(int i=0;i<len;i++){
      if(M[i] == '2'){
         M[i] = '5'; // replace 2 with 5
      }
      else if(M[i] == '6'){ 
         M[i] = '9'; // replace 6 with 9
      }
      mp[M[i]]++; //count frequency of digit of string
   }    
   // creating another hashmap to store the frequency of digit of the number N
   map<char, int>mpN;      
   // iterating number 'N' using while loop     
   while(N > 0){
      int rem = N % 10; // Get the last digit as the remainder        
      //Replace 2 with 5
      if(rem == 2){
         rem = 5;
      }
      //Replace 6 with 9
      if(rem == 6){
         rem = 9;
      }        
      mpN[rem + '0']++; //count frequency of digit of number        
      N = N / 10;
   }    
   int maxCount = INT_MAX;
   //Trvaerse the hashmap of the number to get the maxCount
   for(auto el : mpN){
      // Get the key which is a digit from the number N to be formed
      int key = el.first; 
      // If the key is not present in the string M, then the number N cannot be formed
      if (!mp.count(key))
      return 0; 
      // Divide the frequency of the digit from the string M with the frequency of the current digit of N
      int tempCount = mp[key] / el.second; 
      // Choose the minimum
      maxCount = min(maxCount, tempCount);
   }    
   // returning the maximum count 
   return maxCount;
}
// main function 
int main(){    
   int N = 29; // given number
   string M = "2569783";// given string    
   // calling the function to get a maximum count of N 
   int maxCount = maxCountOfN(N, M);   
   cout<<"The max count of making the number "<< N << " using the digits of the string " << M << " is "<< maxCount<<endl;   
   return 0;
}

输出

The max count of making the number 29 using the digits of the string 2569783 is 2

结论

在本教程中,我们实现了一个程序,用于查找使用数字 M 构造 N 的最大计数,其中 2 和 5 相同,6 和 9 相同。我们实现了一种哈希方法,因为我们必须存储频率,时间复杂度为 O(N+M),空间复杂度为 O(N+M)。其中 M 是字符串的大小,N 是数字的大小。

更新于:2023年5月16日

浏览量 128 次

开启你的职业生涯

完成课程获得认证

开始学习
广告