📌  相关文章
📜  转换长度为N的数字,使其至少包含“ K”次而包含任何一位数字

📅  最后修改于: 2021-04-23 18:08:52             🧑  作者: Mango

给定值“ N” ,它是数字“ A”的长度。您的任务是转换数字,以使数字“ A”中至少存在“ K”次任何数字。为了替换“ N”个数字之一,您还需要计算成本,即旧数字与新数字之间的绝对差。任务是打印将初始编号转换为最终编号所需的最低成本,同时打印最终编号。
注意:如果有多个这样的数字,则按字典顺序打印最小的数字。
例子:

方法:

  1. 初始化长度为“ N”的数字“ A”。
  2. 初始化PAIR STL以存储最小成本和数量。
  3. 将数字作为字符串存储在temp变量中。
  4. 使用两个for循环检查所有具有“ j”差的数字并将其替换为“ i”,如果达到成本则中断。
  5. 用上一个替换最低成本。
  6. 最后,打印最低成本和最终编号。

下面是上述方法的实现:

C++
// C++ program to illustrate
// the above problem
#include 
using namespace std;
 
// function to calculate the minimum
// value and the final number
int finalNumber(int n, int k, string a)
{
    // modtemp = modified temp string
    int modtemp;
 
    // store the count of numbers changed to k
    int co;
 
    // temporary temp string
    string temp;
 
    // To store the minimum cost and no
    pair ans = make_pair(INT_MAX, "");
 
    for (int i = 0; i < 10; i++) {
        // 'i' will replace the digits of N's to
        // generate a number with k same digits
 
        // store the main str in temp str for modification
        temp = a;
 
        // To store the temporary value of the modified number
        modtemp = 0;
 
        // Initial count for the given number to replace 'i'
        co = count(a.begin(), a.end(), i + '0');
 
        // 'j' manages the difference 'i' and 'j'
        for (int j = 1; j < 10; j++) {
 
            // For the elements ahead of 'i' index
            if (i + j < 10) {
 
                // Checks all elements with difference 'j'
                // and replaces them with 'i'
                for (int p = 0; p < n; p++) {
 
                    // Break if count is achieved
                    if (co >= k)
                        break;
 
                    if (i + '0' == temp[p] - j) {
 
                        // Replaces all elements with difference
                        // 'j' and with 'i'
                        temp[p] = i + '0';
                        modtemp += j;
                        co++;
                    }
                }
            }
            // For the elements before 'i' index
            if (i - j >= 0) {
                for (int p = n - 1; p >= 0; p--) {
                    if (co >= k)
                        break;
 
                    if (i + '0' == temp[p] + j) {
                        temp[p] = i + '0';
                        modtemp += j;
                        co++;
                    }
                }
            }
        }
 
        // replace the minimum cost with the previous one
        ans = min(ans, make_pair(modtemp, temp));
    }
    // print the minimum cost and the final number
    cout << ans.first << endl
         << ans.second << endl;
}
 
// Driver code
int main()
{
    // initilaize number length and k
    int n = 5, k = 4;
 
    // initialize the number
    string a = "21122";
 
    finalNumber(n, k, a);
 
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
class GFG
{
    static class pair
    {
        int first;
        String second;
        static pair make_pair(int first, String second)
        {
            pair p = new pair();
            p.first = first;
            p.second = second;
            return p;
        }
    }
     
// count for the given character
static int count(String a,char c)
{
    int co = 0;
    for(int i = 0; i < a.length(); i++)
    if(a.charAt(i) == c)
        co++;
    return co;
}
 
// function to calculate the minimum
// value and the final number
static int finalNumber(int n, int k, String a)
{
    // modtemp = modified temp String
    int modtemp;
 
    // store the count of numbers changed to k
    int co;
 
    // temporary temp String
    char temp[] = new char[a.length()];
 
    // To store the minimum cost and no
    pair ans = pair.make_pair(Integer.MAX_VALUE, "");
 
    for (int i = 0; i < 10; i++)
    {
        // 'i' will replace the digits of N's to
        // generate a number with k same digits
 
        // store the main str in temp str for modification
        temp = a.toCharArray();
 
        // To store the temporary value of the modified number
        modtemp = 0;
 
        // Initial count for the given number to replace 'i'
        co = count(a, (char)(i + '0'));
 
        // 'j' manages the difference 'i' and 'j'
        for (int j = 1; j < 10; j++)
        {
 
            // For the elements ahead of 'i' index
            if (i + j < 10)
            {
 
                // Checks all elements with difference 'j'
                // and replaces them with 'i'
                for (int p = 0; p < n; p++)
                {
 
                    // Break if count is achieved
                    if (co >= k)
                        break;
 
                    if (i + '0' == temp[p] - j)
                    {
 
                        // Replaces all elements with difference
                        // 'j' and with 'i'
                        temp[p] = (char)(i + '0');
                        modtemp += j;
                        co++;
                    }
                }
            }
             
            // For the elements before 'i' index
            if (i - j >= 0)
            {
                for (int p = n - 1; p >= 0; p--)
                {
                    if (co >= k)
                        break;
 
                    if (i + '0' == temp[p] + j)
                    {
                        temp[p] = (char)(i + '0');
                        modtemp += j;
                        co++;
                    }
                }
            }
        }
 
        // replace the minimum cost with the previous one
        if(ans.first > modtemp)
        ans = pair.make_pair(modtemp, new String(temp));
    }
     
    // print the minimum cost and the final number
    System.out.print( ans.first + "\n"
                    + ans.second + "\n");
     
    return -1;
}
 
// Driver code
public static void main(String args[])
{
    // initilaize number length and k
    int n = 5, k = 4;
 
    // initialize the number
    String a = "21122";
 
    finalNumber(n, k, a);
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 program to illustrate
# the above problem
import sys
 
# function to calculate the
# minimum value and the final
# number
def finalNumber(n, k, a):
 
    # To store the minimum
    # cost and no
    ans = [sys.maxsize, ""]
 
    for i in range(10):
       
        # 'i' will replace the
        # digits of N's to generate
        # a number with k same digits
 
        # store the main str in temp
        # str for modification
        temp = a
 
        # To store the temporary
        # value of the modified number
        modtemp = 0
 
        # Initial count for the
        # given number to replace 'i'
        co = a.count(chr(i + ord('0')))
 
        # 'j' manages the difference
        # 'i' and 'j'
        for j in range(1, 10):
 
            # For the elements ahead
            # of 'i' index
            if (i + j < 10):
 
                # Checks all elements with
                # difference 'j' and replaces
                # them with 'i'
                for p in range(n):
 
                    # Break if count is
                    # achieved
                    if (co >= k):
                        break
 
                    if (i + ord('0') ==
                        ord(temp[p]) - j):
 
                        # Replaces all elements
                        # with difference 'j'
                        # and with 'i'
                        temp.replace(temp[p],
                                     chr(i +
                                         ord('0')), 1)
                        modtemp += j
                        co+= 1
 
            # For the elements
            # before 'i' index
            if (i - j >= 0):
                for p in range(n - 1,
                               -1, -1):
                    if (co >= k):
                        break
                    if (i + ord('0') ==
                        ord(temp[p]) + j):
                        temp.replace(temp[p],
                                     chr(i +
                                         ord('0')), 1)
                        modtemp += j
                        co += 1
 
        # replace the minimum cost
        # with the previous one
        ans = min(ans, [modtemp,
                        temp])
 
    # print the minimum cost
    # and the final number
    print(ans[0])
    print(ans[1])
 
# Driver code
if __name__ == "__main__":
 
    # Initilaize number
    # length and k
    n = 5
    k = 4
 
    # initialize the number
    a = "21122"
 
    finalNumber(n, k, a)
 
# This code is contributed by Chitranayal


C#
// C# program to illustrate
// the above problem
using System;
using System.Collections.Generic;
class GFG {
     
    // count for the given character
    static int count(string a,char c)
    {
        int co = 0;
        for(int i = 0; i < a.Length; i++)
        if(a[i] == c)
            co++;
        return co;
    }
      
    // function to calculate the minimum
    // value and the final number
    static int finalNumber(int n, int k, string a)
    {
        // modtemp = modified temp String
        int modtemp;
      
        // store the count of numbers changed to k
        int co;
      
        // temporary temp String
        char[] temp = new char[a.Length];
      
        // To store the minimum cost and no
        Tuple ans = new Tuple(Int32.MaxValue, "");
      
        for (int i = 0; i < 10; i++)
        {
            // 'i' will replace the digits of N's to
            // generate a number with k same digits
      
            // store the main str in temp str for modification
            temp = a.ToCharArray();
      
            // To store the temporary value of the modified number
            modtemp = 0;
      
            // Initial count for the given number to replace 'i'
            co = count(a, (char)(i + '0'));
      
            // 'j' manages the difference 'i' and 'j'
            for (int j = 1; j < 10; j++)
            {
      
                // For the elements ahead of 'i' index
                if (i + j < 10)
                {
      
                    // Checks all elements with difference 'j'
                    // and replaces them with 'i'
                    for (int p = 0; p < n; p++)
                    {
      
                        // Break if count is achieved
                        if (co >= k)
                            break;
      
                        if (i + '0' == temp[p] - j)
                        {
      
                            // Replaces all elements with difference
                            // 'j' and with 'i'
                            temp[p] = (char)(i + '0');
                            modtemp += j;
                            co++;
                        }
                    }
                }
                  
                // For the elements before 'i' index
                if (i - j >= 0)
                {
                    for (int p = n - 1; p >= 0; p--)
                    {
                        if (co >= k)
                            break;
      
                        if (i + '0' == temp[p] + j)
                        {
                            temp[p] = (char)(i + '0');
                            modtemp += j;
                            co++;
                        }
                    }
                }
            }
      
            // replace the minimum cost with the previous one
            if(ans.Item1 > modtemp)
            ans = new Tuple(modtemp, new string(temp));
        }
          
        // print the minimum cost and the final number
        Console.Write( ans.Item1 + "\n" + ans.Item2 + "\n");
          
        return -1;
    }
 
  static void Main()
  {
     
    // initilaize number length and k
    int n = 5, k = 4;
     
    // initialize the number
    string a = "21122";
  
    finalNumber(n, k, a);
  }
}
 
// This code is contributed by divyeshrabadiya07


输出:
1
21222

说明:与仅将1转换为2一样。 2变成k倍。因此成本为2-1 = 1。