Skip to content
Related Articles

Related Articles

Improve Article

Find the Largest Cube formed by Deleting minimum Digits from a number

  • Difficulty Level : Hard
  • Last Updated : 25 May, 2021

Given a number n, the task is to find the largest perfect cube that can be formed by deleting minimum digits(possibly 0) from the number. 
X is called a perfect cube if X = Y3 for some Y.
Examples: 
 

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

 

We can generate cubes of all numbers till from 1 to N1/3 (We don’t consider 0 as 0 is not considered as a perfect cube). We iterate the cubes from largest to the smallest. 
Now if we look at the number n given to us, then we know that this number contains only log(n) + 1 digits, thus we can efficiently approach the problem if we treat this number n as a string hereafter. 
While iterating on the perfect cubes, we check if the perfect cube is a subsequence of the number n when its represented as a string.If this is the case then the deletions required for changing the number n to the current perfect cube is: 
 

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

Since we want the largest cube number we traverse the array of preprocessed cubes in reverse order. 
 

C++




/* C++ code to implement maximum perfect cube
   formed after deleting  minimum digits */
#include <bits/stdc++.h>
using namespace std;
 
// Returns vector of Pre Processed perfect cubes
vector<string> preProcess(long long int n)
{
    vector<string> 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<string> 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<string> 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<String> preProcess(int n)
    {
        Vector<String> 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<String> 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<String> 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<String> preProcess(int n)
    {
        List<String> preProcessedCubes = new List<String>();
        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<String> 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<String> 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




<?php
// PHP code to implement maximum perfect
// cube formed after deleting minimum digits
 
// Returns vector of Pre Processed
// perfect cubes
function preProcess($n)
{
 
    $preProcessedCubes = array();
    for ($i = 1; $i * $i * $i < $n; $i++)
    {
        $iThCube = $i * $i * $i;
         
        // convert the cube to string and
        // push into preProcessedCubes vector
        $cubeString = strval($iThCube);
        array_push($preProcessedCubes,$cubeString);
    }
    return $preProcessedCubes;
}
 
// Utility function for findLargestCube().
// Returns the Largest cube number that
// can be formed
function findLargestCubeUtil($num,$preProcessedCubes)
{
    // reverse the preProcessed cubes so
    // that we have the largest cube in
    // the beginning of the vector
    $preProcessedCubes = array_reverse($preProcessedCubes);
 
    $totalCubes = count($preProcessedCubes);
 
    // iterate over all cubes
    for($i = 0; $i < $totalCubes; $i++)
    {
        $currCube = $preProcessedCubes[$i];
 
        $digitsInCube = strlen($currCube);
        $index = 0;
        $digitsInNumber = strlen($num);
        for ($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 += 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()
function findLargestCube($n)
{
 
    // pre process perfect cubes
    $preProcessedCubes = preProcess($n);
 
    $num = strval($n);
 
    $ans = findLargestCubeUtil($num, $preProcessedCubes);
 
    print("Largest Cube that can be formed from ".$n." is ".$ans."\n");
}
 
// Driver Code
$n = 4125;
findLargestCube($n);
 
$n = 876;
findLargestCube($n)
     
// This code is contributed by mits
?>

Javascript




<script>
/* Javascript code to implement maximum perfect cube
formed after deleting minimum digits */
     
    // Returns vector of Pre Processed perfect cubes
    function preProcess(n)
    {
        let preProcessedCubes =[];
        for (let i = 1; i * i * i <= n; i++)
        {
            let iThCube = i * i * i;
   
            // convert the cube to String and push into
            // preProcessedCubes vector
            let cubeString = (iThCube).toString();
            preProcessedCubes.push(cubeString);
        }
        return preProcessedCubes;
    }
     
    /* Utility function for findLargestCube().
    Returns the Largest cube number that can be formed */
    function findLargestCubeUtil(num,preProcessedCubes)
    {
     
        // reverse the preProcessed cubes so that we
        // have the largest cube in the beginning
        // of the vector
        (preProcessedCubes).reverse();
   
        let totalCubes = preProcessedCubes.length;
   
        // iterate over all cubes
        for (let i = 0; i < totalCubes; i++)
        {
            let currCube = preProcessedCubes[i];
   
            let digitsInCube = currCube.length;
            let index = 0;
            let digitsInNumber = num.length;
            for (let 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()
    function findLargestCube(n)
    {
     
        // pre process perfect cubes
        let preProcessedCubes = preProcess(n);
   
        // convert number n to String
        let num = (n).toString();
   
        let ans = findLargestCubeUtil(num, preProcessedCubes);
   
        document.write("Largest Cube that can be formed from "
                + n + " is " + ans+"<br>");
    }
     
    // Driver Code
    let n;
    n = 4125;
    findLargestCube(n);
 
    n = 876;
    findLargestCube(n);
 
// This code is contributed by unknown2108
</script>
Output: 



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

 

Time Complexity of the above algorithm is O(N1/3log(N) log(N) is due to the fact that the number of digits in N are Log(N) + 1.
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :