📌  相关文章
📜  C ++程序通过逆时针旋转数字将数组元素重新排列为交替的奇偶序列

📅  最后修改于: 2022-05-13 01:55:24.493000             🧑  作者: Mango

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

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

例子:

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

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

下面是上述方法的实现:

C++
// c++ program of the above approach
#include 
using namespace std;
  
// Utility function to rotate the digits of
// array elements such that array elements are
// in placed even-odd or odd-even alternately
bool is_possible(vector& arr, bool check)
{
  
    // Checks if array can be converted
    // into even-odd or odd-even form
    bool exists = true;
  
    // Store array elements
    vector cpy = arr;
    bool flag;
    // Traverse the array
    for (int i = 0; i < arr.size(); i++) {
  
        // Check if arr[i] is already
        // at correct position
        if (arr[i] % 2 == check) {
            check = !(check);
            continue;
        }
  
        // Checks if it is possible
        // to modify the number arr[i]
        // by rotating the digits of
        // the number anticlockwise
        flag = false;
  
        // Stores the number arr[i] as
        // string
        string strEle = to_string(arr[i]);
  
        // Traverse over the digits of
        // the current element
        for (int j = 0; j < strEle.size(); j++) {
  
            // Checks if parity of check and
            // current digit is same or not
            if (int(strEle[j]) % 2 == check) {
  
                // Rotates the string by j + 1 times
                // in anticlockwise
                arr[i] = stoi(strEle.substr(j + 1)
                              + strEle.substr(0, j + 1));
  
                // Marks the flag
                // as true and break
                flag = true;
                break;
            }
        }
  
        // If flag is false
        if (flag == false) {
            // Update exists
            exists = false;
            break;
        }
  
        // Changes the
        // parity of check
        check = !(check);
    }
  
    // Checks if arr[] cannot be
    // modified, then returns false
    if (!exists) {
        arr = cpy;
        return false;
    }
  
    // Otherwise, return true
    else
        return true;
}
  
// Function to rotate the digits of array
// elements such that array elements are
// in the form of even-odd or odd-even form
void convert_arr(vector& arr)
{
  
    // If array elements can be arranged
    // in even-odd manner alternately
    if (is_possible(arr, 0)) {
        for (auto& i : arr)
            cout << i << " ";
    }
  
    // If array elements can be arranged
    // in odd-even manner alternately
    else if (is_possible(arr, 1)) {
        for (auto& i : arr)
            cout << i << " ";
    }
  
    // Otherwise, prints -1
    else
        cout << "-1" << endl;
}
  
// Driver Code
int main()
{
  
    vector arr = { 143, 251, 534, 232, 854 };
    convert_arr(arr);
}
  
// This code is contributed by grand_master.


输出:
314 251 534 223 854

时间复杂度: O(N)
辅助空间: O(N)

有关详细信息,请参阅有关通过逆时针旋转数字将数组元素重新排列为交替奇偶序列的完整文章!