给定一个n个数的数组。以产生最大价值的方式排列它们。在排列偶数与奇数之间的顺序时,应分别保持偶数与奇数之间的顺序。 例如:
null
Input : {78, 81, 88, 79, 117, 56}Output : 8179788856117The numbers are arranged in the order:81 79 78 88 56 117 and then concatenated.The odd numbers 81 79 117 andThe even numbers 78 88 56 maintaintheir orders as in the original array.Input : {400, 99, 76, 331, 65, 18}Output : 99400763316518
这个问题是这个问题的变种 将给定的数字排列成最大的数字 在这个问题中,我们找到了具有一定限制的最大数,即最终结果中需要保持奇数和偶数的顺序,从而获得O(n)时间复杂度的解。 以下是找到维持奇数和偶数顺序的最大数的步骤。
- 将原始数组的数目分成两个数组 甚至 和 奇数 .除此之外,数字的顺序应保持不变。
- 合并 即使 和 古怪的 数组和合并时遵循条件。设X是一个数组的元素,Y是另一个数组的元素。比较 XY (Y附在X之后)和 YX (X附于Y之后)。如果XY较大,则将X添加到最终结果中,否则将Y添加到最终结果中。
C++
// C++ implementation to form the biggest number // by arranging numbers in certain order #include <bits/stdc++.h> using namespace std; // function to merge the even and odd list // to form the biggest number string merge(vector<string> arr1, vector<string> arr2) { int n1 = arr1.size(); int n2 = arr2.size(); int i = 0, j = 0; // to store the final biggest number string big = "" ; while (i < n1 && j < n2) { // if true then add arr1[i] to big if ((arr1[i]+arr2[j]).compare((arr2[j]+arr1[i])) > 0) big += arr1[i++]; // else add arr2[j] to big else big += arr2[j++]; } // add remaining elements // of arr1 to big while (i < n1) big += arr1[i++]; // add remaining elements // of arr2 to big while (j < n2) big += arr2[j++] ; return big; } // function to find the biggest number string printLargest(vector<string> arr, int n) { vector<string> even, odd; for ( int i=0; i<n; i++) { int lastDigit = arr[i].at(arr[i].size() - 1) - '0' ; // inserting even numbers if (lastDigit % 2 == 0) even.push_back(arr[i]); // inserting odd numbers else odd.push_back(arr[i]); } // merging both the array string biggest = merge(even, odd); // final required biggest number return biggest; } // Driver program to test above int main() { // arr[] = {78, 81, 88, 79, 117, 56} vector<string> arr; arr.push_back( "78" ); arr.push_back( "81" ); arr.push_back( "88" ); arr.push_back( "79" ); arr.push_back( "117" ); arr.push_back( "56" ); int n = arr.size(); cout << "Biggest number = " << printLargest(arr, n); return 0; } |
JAVA
import java.util.Vector; // Java implementation to form the biggest number // by arranging numbers in certain order class GFG { // function to merge the even and odd list // to form the biggest number static String merge(Vector<String> arr1, Vector<String> arr2) { int n1 = arr1.size(); int n2 = arr2.size(); int i = 0 , j = 0 ; // to store the final biggest number String big = "" ; while (i < n1 && j < n2) { // if true then add arr1[i] to big if ((arr1.get(i) + arr2.get(j)). compareTo((arr2.get(j) + arr1.get(i))) > 0 ) { big += arr1.get(i++); } // else add arr2[j] to big else { big += arr2.get(j++); } } // add remaining elements // of arr1 to big while (i < n1) { big += arr1.get(i++); } // add remaining elements // of arr2 to big while (j < n2) { big += arr2.get(j++); } return big; } // function to find the biggest number static String printLargest(Vector<String> arr, int n) { Vector<String> even = new Vector<String>(), odd = new Vector<String>(); for ( int i = 0 ; i < n; i++) { int lastDigit = arr.get(i). charAt(arr.get(i).length() - 1 ) - '0' ; // inserting even numbers if (lastDigit % 2 == 0 ) { even.add(arr.get(i)); } // inserting odd numbers else { odd.add(arr.get(i)); } } // merging both the array String biggest = merge(even, odd); // final required biggest number return biggest; } // Driver code public static void main(String[] args) { Vector<String> arr = new Vector<String>(); arr.add( "78" ); arr.add( "81" ); arr.add( "88" ); arr.add( "79" ); arr.add( "117" ); arr.add( "56" ); int n = arr.size(); System.out.println( "Biggest number = " + printLargest(arr, n)); } } // This code is contributed by PrinciRaj1992 |
C#
// C# implementation to form the biggest number // by arranging numbers in certain order using System; using System.Collections.Generic; class GFG { // function to merge the even and odd list // to form the biggest number static String merge(List<String> arr1, List<String> arr2) { int n1 = arr1.Count; int n2 = arr2.Count; int i = 0, j = 0; // to store the final biggest number String big = "" ; while (i < n1 && j < n2) { // if true then Add arr1[i] to big if ((arr1[i] + arr2[j]).CompareTo((arr2[j] + arr1[i])) > 0) { big += arr1[i++]; } // else Add arr2[j] to big else { big += arr2[j++]; } } // Add remaining elements // of arr1 to big while (i < n1) { big += arr1[i++]; } // Add remaining elements // of arr2 to big while (j < n2) { big += arr2[j++]; } return big; } // function to find the biggest number static String printLargest(List<String> arr, int n) { List<String> even = new List<String>(), odd = new List<String>(); for ( int i = 0; i < n; i++) { int lastDigit = arr[i][arr[i].Length - 1] - '0' ; // inserting even numbers if (lastDigit % 2 == 0) { even.Add(arr[i]); } // inserting odd numbers else { odd.Add(arr[i]); } } // merging both the array String biggest = merge(even, odd); // final required biggest number return biggest; } // Driver code public static void Main() { List<String> arr = new List<String>(); arr.Add( "78" ); arr.Add( "81" ); arr.Add( "88" ); arr.Add( "79" ); arr.Add( "117" ); arr.Add( "56" ); int n = arr.Count; Console.WriteLine( "Biggest number = " + printLargest(arr, n)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // JavaScript implementation to form the biggest number // by arranging numbers in certain order // function to merge the even and odd list // to form the biggest number function merge(arr1, arr2) { let n1 = arr1.length; let n2 = arr2.length; let i = 0, j = 0; // to store the final biggest number let big = "" ; while (i < n1 && j < n2) { // if true then add arr1[i] to big if ((arr1[i]+arr2[j]).localeCompare((arr2[j]+arr1[i])) > 0) big += arr1[i++]; // else add arr2[j] to big else big += arr2[j++]; } // add remaining elements // of arr1 to big while (i < n1) big += arr1[i++]; // add remaining elements // of arr2 to big while (j < n2) big += arr2[j++] ; return big; } // function to find the biggest number function printLargest(arr, n) { let even = []; let odd = []; for (let i=0; i<n; i++) { let lastDigit = arr[i].charCodeAt(arr[i].length - 1) - '0' ; // inserting even numbers if (lastDigit % 2 == 0) even.push(arr[i]); // inserting odd numbers else odd.push(arr[i]); } // merging both the array let biggest = merge(even, odd); // final required biggest number return biggest; } // Driver program to test above // arr[] = {78, 81, 88, 79, 117, 56} let arr = []; arr.push( "78" ); arr.push( "81" ); arr.push( "88" ); arr.push( "79" ); arr.push( "117" ); arr.push( "56" ); let n = arr.length; document.write( "Biggest number = " + printLargest(arr, n)); // This code is contributed by Surbhi Tyagi. </script> |
输出:
8179788856117
时间复杂性: O(n) 本文由 阿尤什·焦哈里 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END