📌  相关文章
📜  找出通过从数字中删除最小数字形成的最大立方体

📅  最后修改于: 2021-10-26 06:38:17             🧑  作者: Mango

给定一个数字 n,任务是找到可以通过从数字中删除最小数字(可能是 0)而形成的最大完美立方体。
如果对于某个 Y,X = Y 3 ,则 X 称为完美立方体。
例子:

Input : 4125
Output : 125
Explanation
125 = 53. We can form 125 by deleting digit 4 from 4125

Input : 876
Output :8
Explanation
8 = 23. We can form 8 by deleting digits 7 and 6 from 876

我们可以生成所有数字的立方体,直到从 1 到 N 1/3 (我们不考虑 0,因为 0 不被视为完美立方体)。我们从最大到最小迭代立方体。
现在,如果我们查看给我们的数字 n,那么我们知道该数字仅包含 log(n) + 1 位数字,因此,如果我们将此数字 n 视为字符串,我们可以有效地解决该问题。
在迭代完美立方体时,我们检查完美立方体是否是数字 n 的子序列,当它表示为字符串。如果是这种情况,那么将数字 n 更改为当前完美立方体所需的删除是:

No of deleted digits = No of digits in number n - 
                       Number of digits in current 
                                      perfect cube

因为我们想要最大的立方体数,所以我们以相反的顺序遍历预处理立方体的数组。

C++
/* C++ code to implement maximum perfect cube
   formed after deleting  minimum digits */
#include 
using namespace std;
 
// Returns vector of Pre Processed perfect cubes
vector preProcess(long long int n)
{
    vector preProcessedCubes;
    for (int i = 1; i * i * i <= n; i++) {
        long long int iThCube = i * i * i;
 
        // convert the cube to string and push into
        // preProcessedCubes vector
        string cubeString = to_string(iThCube);
        preProcessedCubes.push_back(cubeString);
    }
    return preProcessedCubes;
}
 
/* Utility function for findLargestCube().
   Returns the Largest cube number that can be formed */
string findLargestCubeUtil(string num,
                    vector preProcessedCubes)
{
    // reverse the preProcessed cubes so that we
    // have the largest cube in the beginning
    // of the vector
    reverse(preProcessedCubes.begin(), preProcessedCubes.end());
 
    int totalCubes = preProcessedCubes.size();
 
    // iterate over all cubes
    for (int i = 0; i < totalCubes; i++) {
        string currCube = preProcessedCubes[i];
 
        int digitsInCube = currCube.length();
        int index = 0;
        int digitsInNumber = num.length();
        for (int j = 0; j < digitsInNumber; j++) {
 
            // check if the current digit of the cube
            // matches with that of the number num
            if (num[j] == currCube[index])
                index++;
             
            if (digitsInCube == index)                
                return currCube;           
        }
    }
 
    // if control reaches here, the its
    // not possible  to form a perfect cube
    return "Not Possible";
}
 
// wrapper for findLargestCubeUtil()
void findLargestCube(long long int n)
{
    // pre process perfect cubes
    vector preProcessedCubes = preProcess(n);
 
    // convert number n to string
    string num = to_string(n);
 
    string ans = findLargestCubeUtil(num, preProcessedCubes);
 
    cout << "Largest Cube that can be formed from "
         << n << " is " << ans << endl;
}
 
// Driver Code
int main()
{
    long long int n;
    n = 4125;
    findLargestCube(n);
 
    n = 876;
    findLargestCube(n);
 
    return 0;
}


Java
/* Java code to implement maximum perfect cube
formed after deleting minimum digits */
import java.util.*;
class GFG
{
 
    // Returns vector of Pre Processed perfect cubes
    static Vector preProcess(int n)
    {
        Vector preProcessedCubes = new Vector<>();
        for (int i = 1; i * i * i <= n; i++)
        {
            int iThCube = i * i * i;
 
            // convert the cube to String and push into
            // preProcessedCubes vector
            String cubeString = String.valueOf(iThCube);
            preProcessedCubes.add(cubeString);
        }
        return preProcessedCubes;
    }
 
    /* Utility function for findLargestCube().
    Returns the Largest cube number that can be formed */
    static String findLargestCubeUtil(String num,
            Vector preProcessedCubes)
    {
        // reverse the preProcessed cubes so that we
        // have the largest cube in the beginning
        // of the vector
        Collections.reverse(preProcessedCubes);
 
        int totalCubes = preProcessedCubes.size();
 
        // iterate over all cubes
        for (int i = 0; i < totalCubes; i++)
        {
            String currCube = preProcessedCubes.get(i);
 
            int digitsInCube = currCube.length();
            int index = 0;
            int digitsInNumber = num.length();
            for (int j = 0; j < digitsInNumber; j++)
            {
 
                // check if the current digit of the cube
                // matches with that of the number num
                if (num.charAt(j) == currCube.charAt(index))
                {
                    index++;
                }
 
                if (digitsInCube == index)
                {
                    return currCube;
                }
            }
        }
 
        // if control reaches here, the its
        // not possible to form a perfect cube
        return "Not Possible";
    }
 
    // wrapper for findLargestCubeUtil()
    static void findLargestCube(int n)
    {
        // pre process perfect cubes
        Vector preProcessedCubes = preProcess(n);
 
        // convert number n to String
        String num = String.valueOf(n);
 
        String ans = findLargestCubeUtil(num, preProcessedCubes);
 
        System.out.println("Largest Cube that can be formed from "
                + n + " is " + ans);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int n;
        n = 4125;
        findLargestCube(n);
 
        n = 876;
        findLargestCube(n);
    }
}
 
// This code has been contributed by 29AjayKumar


Python3
# Python3 code to implement maximum perfect
# cube formed after deleting minimum digits
import math as mt
 
# Returns vector of Pre Processed
# perfect cubes
def preProcess(n):
 
    preProcessedCubes = list()
    for i in range(1, mt.ceil(n**(1. / 3.))):
        iThCube = i**3
         
        # convert the cube to string and
        # push into preProcessedCubes vector
        cubeString = str(iThCube)
        preProcessedCubes.append(cubeString)
         
    return preProcessedCubes
 
# Utility function for findLargestCube().
# Returns the Largest cube number that
# can be formed
def findLargestCubeUtil(num,preProcessedCubes):
     
    # reverse the preProcessed cubes so
    # that we have the largest cube in
    # the beginning of the vector
    preProcessedCubes = preProcessedCubes[::-1]
 
    totalCubes = len(preProcessedCubes)
 
    # iterate over all cubes
    for i in range(totalCubes):
        currCube = preProcessedCubes[i]
 
        digitsInCube = len(currCube)
        index = 0
        digitsInNumber = len(num)
        for j in range(digitsInNumber):
             
            # check if the current digit of the cube
            # matches with that of the number num
            if (num[j] == currCube[index]):
                index += 1
             
            if (digitsInCube == index):            
                return currCube        
     
    # if control reaches here, the its
    # not possible to form a perfect cube
    return "Not Possible"
 
# wrapper for findLargestCubeUtil()
def findLargestCube(n):
 
    # pre process perfect cubes
    preProcessedCubes = preProcess(n)
 
    num = str(n)
 
    ans = findLargestCubeUtil(num, preProcessedCubes)
 
    print("Largest Cube that can be formed from",
                                    n, "is", ans)
 
# Driver Code
n = 4125
findLargestCube(n)
 
n = 876
findLargestCube(n)
     
# This code is contributed
# by mohit kumar 29


C#
/* C# code to implement maximum perfect cube
formed after deleting minimum digits */
using System;
using System.Collections.Generic;
 
class GFG
{
 
    // Returns vector of Pre Processed perfect cubes
    static List preProcess(int n)
    {
        List preProcessedCubes = new List();
        for (int i = 1; i * i * i <= n; i++)
        {
            int iThCube = i * i * i;
 
            // convert the cube to String and push into
            // preProcessedCubes vector
            String cubeString = String.Join("",iThCube);
            preProcessedCubes.Add(cubeString);
        }
        return preProcessedCubes;
    }
 
    /* Utility function for findLargestCube().
    Returns the Largest cube number that can be formed */
    static String findLargestCubeUtil(String num,
            List preProcessedCubes)
    {
        // reverse the preProcessed cubes so that we
        // have the largest cube in the beginning
        // of the vector
        preProcessedCubes.Reverse();
 
        int totalCubes = preProcessedCubes.Count;
 
        // iterate over all cubes
        for (int i = 0; i < totalCubes; i++)
        {
            String currCube = preProcessedCubes[i];
 
            int digitsInCube = currCube.Length;
            int index = 0;
            int digitsInNumber = num.Length;
            for (int j = 0; j < digitsInNumber; j++)
            {
 
                // check if the current digit of the cube
                // matches with that of the number num
                if (num[j] == currCube[index])
                {
                    index++;
                }
 
                if (digitsInCube == index)
                {
                    return currCube;
                }
            }
        }
 
        // if control reaches here, the its
        // not possible to form a perfect cube
        return "Not Possible";
    }
 
    // wrapper for findLargestCubeUtil()
    static void findLargestCube(int n)
    {
        // pre process perfect cubes
        List preProcessedCubes = preProcess(n);
 
        // convert number n to String
        String num = String.Join("",n);
 
        String ans = findLargestCubeUtil(num, preProcessedCubes);
 
        Console.WriteLine("Largest Cube that can be formed from "
                + n + " is " + ans);
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int n;
        n = 4125;
        findLargestCube(n);
 
        n = 876;
        findLargestCube(n);
    }
}
 
// This code contributed by Rajput-Ji


PHP


Javascript


输出:
Largest Cube that can be formed from 4125 is 125
Largest Cube that can be formed from 876 is 8

上述算法的时间复杂度为 O(N 1/3 log(N) log(N) 是因为 N 中的位数为 Log(N) + 1。