Last Updated on March 28, 2022 by Ria Pathak
Concepts Used
Strings, Sorting
Difficulty Level
Hard
Problem Statement (Simplified):
Given an array of numbers, arrange them in such a way that they form the largest number on joining.
See original problem statement here
Test Case
Input:
4
64 646 56 46
Output:
646645646
Explanation:
On joining above elements in different order and combinations, we get total 24 numbers :
646465646
646645646
566464646
645664646
646566446
566466446
566464664
646564664
465664664
564664664
646465664
466465664
466456646
644656646
564664646
465664646
645646646
566446646
646644656
646464656
466466456
646466456
644664656
466464656
In all combinations, we can see 646645646 is the largest number, so 646645646 is our answer.
Solving Approach :
Bruteforce Approach:
1) We can check all the permutations of all the elements in the array.
2) For all the permutation, we’ll convert them into numbers and then check which of them is maximum and after checking all permutations we print the maximum number.
3) All permutations of the array takeO(N!)
which is very inefficient. So we move to another approach which is more efficient than this.
Efficient Approach :
1) The efficient approach uses String comparison and sorting.
2) We sort the array by using a custom comparing function.
3) When comparing two strings, let’s sayA
andB
, we concatenate them in the form ofAB
andBA
.
4) Then we check which one of them is big, ifBA
is greater thanAB
, then we swap both and move forward.
5) After sorting is done, we print all the numbers in sequence. This results in the required number.
Example
Let’s take test case we discussed above, where array a is [64,646,56,46]
.
We can dry run for above procedure as :
For i = 0:
- j = 1 :
Value at
a[i]
is64
and value ata[j]
is646
.
On cocatenating them, we getAB = 64646
andBA = 64664
.
As we can see value ofBA
is greater than value ofAB
, so we swap both values, and array becomes[646,64,56,46]
. - j = 2 :
Value at
a[i]
is646
and value ata[j]
is56
.
On cocatenating them, we getAB = 64656
andBA = 56646
.
As we can see value ofBA
is smaller than value ofAB
, so we keep the array same. - j = 3 :
Value at
a[i]
is646
and value ata[j]
is46
.
On cocatenating them, we getAB = 64646
andBA = 46646
.
As we can see value ofBA
is smaller than value ofAB
, so we keep the array same.For i = 1:
- j = 2 :
Value at
a[i]
is64
and value ata[j]
is56
.
On cocatenating them, we getAB = 6456
andBA = 5664
.
As we can see value ofBA
is smaller than value ofAB
, so we keep the array same. - j = 3 :
Value at
a[i]
is64
and value ata[j]
is46
.
On cocatenating them, we getAB = 6446
andBA = 4664
.
As we can see value ofBA
is smaller than value ofAB
, so we keep the array same.For i = 2:
- j = 3 :
Value at
a[i]
is56
and value ata[j]
is46
.
As we can see value ofBA
is smaller than value ofAB
, so we keep the array same.
As we can see whole array is sorted accordigly as we wanted, so final array is [646,64,56,46]
. So, we print whole array with no gap as our answer. 646645646
is our answer.
Solutions
#include <stdio.h> #include<string.h> void swap( char *first, char *second){ char AB[10000], BA[10000]; strcpy(AB, first); strcpy(BA, second); strcat(AB,second); strcat(BA,first); if(strcmp(BA,AB)>0){ char temp[10000]; strcpy(temp,second); strcpy(second,first); strcpy(first,temp); } } int main() { int test; scanf("%d",&test); while(test--){ int n; scanf("%d", &n); char a[n][10000]; for(int i=0; i<n; i++){ scanf("%s", a[i]); } for(int i=0; i<n; i++) for(int j=i+1; j<n; j++) swap(a[i],a[j]); for(int i=0; i<n; i++) printf("%s",a[i]); printf("\n"); } }
#include <bits/stdc++.h> using namespace std; int myCompare(string A, string B) { string AB = A.append(B); string BA = B.append(A); return AB.compare(BA) > 0 ? 1: 0; } int main() { int t; cin>>t; while(t--) { int n; cin>>n; vector<string> arr(n); for(int i=0;i<n;i++) { cin >> arr[i]; } sort(arr.begin(), arr.end(), myCompare); for (int i=0; i < arr.size() ; i++ ) cout << arr[i]; cout<<"\n"; } }
import java.util.*; class prepBytes { static void printLargestVal(Vector<String> arr){ Collections.sort(arr, new Comparator<String>(){ @Override public int compare(String X, String Y) { String XY=X + Y; String YX=Y + X; return XY.compareTo(YX) > 0 ? -1:1; } }); Iterator it = arr.iterator(); while(it.hasNext()) System.out.print(it.next()); System.out.println(); } public static void main (String[] args) { Scanner sc= new Scanner(System.in); int test_cases; test_cases = sc.nextInt(); while(test_cases != 0){ int n; n = sc.nextInt(); Vector<String> arr; arr = new Vector<>(); for(int i=0; i<n ; i++){ int temp = sc.nextInt(); arr.add(Integer.toString(temp)); } printLargestVal(arr); test_cases--; } } }
for _ in range(int(input())): n = int(input()) arr = input().split() arr.sort(reverse = True) print(*arr, sep = "")
Space Complexity of this approach would be
O(1).
[forminator_quiz id="1273"]
This article tried to discuss Strings, Sorting. Hope this blog helps you understand and solve the problem. To practice more problems on Strings, Sorting you can check out MYCODE | Competitive Programming.