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。