C++程序 通过数字逆时针旋转将数组元素重新排列成交替的偶数-奇数序列

C++程序 通过数字逆时针旋转将数组元素重新排列成交替的偶数-奇数序列

给定一个由 N 个正整数组成的数组 arr[] ,任务是将数组元素的数字逆时针旋转,使数组元素以交替的偶数-奇数或奇数-偶数形式排列。如果存在多个解决方案,则打印其中任何一个。否则,打印 -1

示例:

输入: arr[] = { 143, 251, 534, 232, 854 }

输出: 143 512 345 232 485

解释:
将arr[1]逆时针旋转1次会将arr[1]修改为512。

将arr[2]逆时针旋转1次会将arr[2]修改为345。

将arr[4]逆时针旋转2次会将arr[4]修改为485。

输入: arr[] = { 44, 23, 21, 33, 14 }

输出: 44 23 12 33 14

方法: 上述问题可以通过将第一个数组元素修改为奇数或偶数来解决。可以通过将数字转换为字符串,然后根据需要向左旋转字符串的字符来修改数组元素。按照以下步骤解决问题:

  • 将第一个数组元素重新排列为偶数,并检查剩余的数组元素是否可以交替重新排列为奇偶数。如果找到true,则重新排列数组元素为奇偶数并打印数组元素。
  • 否则,将第一个数组元素重新排列为奇数,并检查剩余的数组元素是否可以交替重新排列为偶奇数。如果找到true,则将剩余的数组元素重新排列为偶奇数,并打印数组元素。
  • 否则,打印 -1

以下是上述方法的实现:

// C ++ 上述方法的程序
#include <bits/stdc++.h>
using namespace std;
 
//旋转数组元素的实用程序,
//以便数组元素是
//交替的奇偶或偶数
bool is_possible(vector<int>& arr, bool check)
{
 
    //检查是否可以将数组
    //转换为偶数-奇数或奇数-偶数形式
    bool exists = true;
 
    //存储数组元素
    vector<int> cpy = arr;
    bool flag;
    //遍历数组
    for (int i = 0; i < arr.size(); i++) {
 
        //检查arr [i]是否已
        //在正确的位置
        if (arr[i]%2 == check) {
            check =!(check);
            继续;
        }
 
        //检查是否有可能
        //通过逆时针旋转数字修改数字arr [i]
        //数码
        flag = false;
 
        //将数字arr [i]存储为
        //字符串
        string strEle = to_string(arr[i]);
 
        //遍历当前元素的数字
        for (int j = 0; j <strEle.size(); j++) {
 
            //检查检查的奇偶性和
            //当前数字是相同的还是不同的
            if(int(strEle [j])%2 ==检查){
 
                //将字符串逆时针旋转j + 1次
                //顺时针方向
                arr [i] = stoi(strEle.substr(j + 1)
                               + strEle.substr(0,j + 1));
 
                //将flag标记为真,并中断
                标志=真;
                休息;
            }
        }
 
        //如果flag为false
        如果(flag == false){
            //更新exists
            exists = false;
            休息;
        }
 
        //更改
        //检查的奇偶性
        check =!(check);
    }
 
    //检查是否不能修改arr [],
    //然后返回false
    如果(!exists){
        arr = cpy;
        返回false;
    }
 
    //否则,返回true
    其他
        返回true;
}
 
//旋转数组的数字
//以便数组元素是
//奇偶交替或奇偶交替形式
void convert_arr(vector<int>& arr)
{
 
    //如果可以安排数组元素
    //交替的偶数-奇数方式
    如果(is_possible(arr,0)){
        为(auto&i:arr)
            cout << i <<“ ”;
    }
 
    //如果可以安排数组元素
    //交替的奇偶方式
    其他如果(is_possible(arr,1)){
        为(auto&i:arr)
            cout << i <<“ ”;
    }
 
    //否则,打印-1
    其他
        cout <<“-1”<< endl;
}
 
//驱动程序代码
int main()
{
 
    vector<int> arr = {143,251,534,232,854};
    convert_arr(arr);
}

输出:

314 251 534 223 854

时间复杂度 :O(N),因为我们使用循环遍历了N次。

辅助空间 :O(N),因为我们使用额外的空间用于cpy。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例