C++中通过连接数组旋转后的所有元素获得最大数字


给定一个循环数字数组。循环数组是指元素排列成第一个元素紧挨着最后一个元素的形式。它们用于实现队列。

每个元素具有相同或不同的数字位数。目标是通过连接数字创建尽可能大的数字,如果需要,可以使用元素的旋转。我们将通过查找所有元素所有最左边的数字中最大的最左边数字来做到这一点。最左边的数字最大的那个数字将占据第一个位置。

  • 如果它位于第一个位置,则索引 1 到 n-1 的所有数字按原样放置。

  • 如果它位于中间某个位置,并且它的索引为 i,则索引 i+1 到 n-1 的所有数字首先附加,然后是索引 0 到 i-1 的数字。

  • 如果它是最后一个,则索引 0 到 i-1 的所有数字附加在其之后。

输入

Arr[] = { 121, 43, 65, 32 }

输出

Highest number: 653212143

说明 - 最高的最左边的数字是 6。将 65 放在第一位,然后是 32,然后是 121、43。因为 Arr[] 是一个循环数组。

输入

Arr[] = { 1101, 9, 321, 77 }

输出

Highest number: 9321771101

说明 - 最高的最左边的数字是 9321771101。将 9 放在第一位,然后是 321,然后是 77、1101。因为 Arr[] 是一个循环数组。

下面程序中使用的方案如下

  • 数组 arr[] 存储数字。

  • 函数 Largets(int arr[],int n) 以数组及其长度 n 作为输入,并打印可以组成的最大数字。

  • 变量 maxx 用于存储具有最高最左边的数字的数字,初始化为 0。

  • Pos 用于存储 maxx 的索引。

  • 从 i=0 到 n 开始,通过将每个 arr[i] 除以 10 直到它变为 0 来查找每个 arr[i] 的最左边的数字。每次余数将表示个位上的数字。

  • 如果当前此类数字是最高的,当 num==0 时(表示 rem 具有最左边的数字),更新 maxx 和 pos。

  • 打印从索引 pos 到数组末尾的元素,然后再次从索引 0 到 pos-1。

示例

 实时演示

#include <bits/stdc++.h>
using namespace std;
void Largest(int arr[], int n){
   int maxx = 0;
   int pos = 0; //index of number with highest leftmost digit
   for (int i = 0; i < n; i++) {
      int num = arr[i];
      // check for the last digit
      while (num!=0) {
         int rem = num % 10;
         num = num / 10;
         if (num == 0) {
            if (maxx < rem) {
               maxx = rem;
               pos = i;
            }
         }
      }
   }
   // print the largest number
   cout<<"Largest number by concatenation: ";
   for (int i = pos; i < n; i++)
      cout << arr[i];
   for (int i = 0; i < pos; i++)
      cout << arr[i];
}
int main(){
   int Arr[] = { 12,34,56,98 };
   int size=4;
   Largest(Arr,size);
   return 0;
}

输出

Largest number by concatenation: 98123456

更新于: 2020-07-28

650 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告