C++ 中偶數位置的正數和奇數位置的負數(相對順序不保持)


在這個問題中,我們得到一個數組,我們的任務是將陣列轉換為所有正數位於偶數索引位置,所有負數位於奇數索引位置。

正數和負數的數量可能不相等,在這種情況下,我們將不會移動額外的值。

讓我們舉個例子來理解這個問題,

輸入 − {3, 5, -1, 19, -7, -2}

輸出 − {3, -1, 5, -7, 19, -2}

為了解決這個問題,我們將不得不找到陣列中順序錯誤的元素。找到這個元素的方法可能不止一種,這裡我們將討論其中兩種。

方法 1

此方法將簡單地遍歷陣列並查詢不在其位置上的元素(即正數不在偶數位置,負數不在奇數位置)的第一次出現,然後交換它們。我們將重複此過程,直到遍歷整個陣列。

示例

程式演示了我們解決方案的實現,

 線上演示

#include<iostream>
using namespace std;
void swapElements(int* a, int i , int j){
   int temp = a[i];
   a[i] = a[j];
   a[j] = temp;
   return ;
}
void printArray(int* a, int n){
   for(int i = 0; i<n; i++)
   cout<<a[i]<<"\t";
   cout<<endl;
   return ;
}
void generateOrderedArray(int arr[], int n){
   for(int i = 0; i <n; i++){
      if(arr[i] >= 0 && i % 2 == 1){
         for(int j = i + 1; j <n; j++){
            if(arr[j] < 0 && j % 2 == 0){
               swapElements(arr, i, j);
               break ;
            }
         }
      }
      else if(arr[i] < 0 && i % 2 == 0){
         for(int j = i + 1; j <n; j++){
            if(arr[j] >= 0 && j % 2 == 1){
               swapElements(arr, i, j);
               break;
            }
         }
      }
   }
   printArray(arr, n);
}
int main(){
   int arr[] = { 1, -3, 5, 6, -3, 6, 7, -4, 9, 10 };
   int n = sizeof(arr)/sizeof(arr[0]);
   cout<<"Inital Array is : ";
   printArray(arr, n);
   cout<<"Array with positive numbers at even index and negative numbers at odd index :";
   generateOrderedArray(arr,n);
   return 0;
}

輸出

Inital Array is : 3 5 -1 19 -7 -2
Array with positive numbers at even index and negative numbers at odd index : 3 -1 5 -7 19 -2

方法 2

在這種方法中,我們將使用一個類似於快速排序技術的流程。在這裡,我們將使用兩個指標,一個用於正數,另一個用於負數。我們將正數指標設定在索引 0(偶數索引),負數指標設定在索引 1(奇數索引)。然後指標每步前進 2 個位置。當正數指標遇到負數,負數指標遇到正數時停止。然後在兩者都停止時交換。如果任何一個指標超出陣列索引,我們將停止執行。

示例

程式演示了我們解決方案的實現

 線上演示

#include <iostream>
using namespace std;
void swapElements(int* a, int i , int j){
   int temp = a[i];
   a[i] = a[j];
   a[j] = temp;
   return ;
}
void printArray(int *a, int n){
   for (int i = 0; i <n; i++)
   cout<<a[i]<<"\t";
   cout<<endl;
}
void generateOrderedArray(int a[], int size){
   int positive = 0, negative = 1;
   while (1) {
      while (positive < size && a[positive] >= 0)
      positive += 2;
      while (negative <size && a[negative] <= 0)
      negative += 2;
      if (positive < size && negative < size)
         swapElements(a, positive, negative);
      else
         break;
   }
}
int main(){
   int arr[] = { 3, 5, -1, 19, -7, -2 };
   int n = (sizeof(arr) / sizeof(arr[0]));
   cout<<"Inital Array is : ";
   printArray(arr, n);
   cout<<"Array with positive numbers at even index and negative numbers at odd index : ";
   generateOrderedArray(arr, n);
   printArray(arr, n);
   return 0;
}

輸出

Inital Array is : 3 5 -1 19 -7 -2
Array with positive numbers at even index and negative numbers at odd index : 3 -1 5 -7 19 -2

更新於: 2020年4月17日

294 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告