在 C++ 中检查数组是否已排序和旋转

c++server side programmingprogramming

给定一个整数数组,任务是检查该数组是否已排序(升序)并在某个位置后旋转。

例如

输入 1:

N = [7, 8, 9, 4, 5, 6]

输出:

True

解释: 由于给定的数组是升序的,并且第 3 个位置之后的元素已旋转,因此在这种情况下我们将返回 True。

输入 2:

N = [1, 5, 7, 6, 2, 3]

输出:

False

解释: 由于给定的数组既不是按升序排列,也没有按某个特定位置旋转,因此输出为 False。

解决此问题的方法

我们有一个数组,其中元素按升序排列或未排序。如果数组必须排序和旋转,则至少会有一个元素,使得 N[i] > N[i+1]。

因此,对于每个 N[i],我们将计算是否存在满足条件的任何元素,并相应地返回 True 或 False。

  • 输入一个数组元素。
  • 布尔函数 checkSortedandRotated(int *arr, int n) 将数组及其大小作为输入,如果数组已排序并旋转,则返回 true,否则返回 false。
  • 遍历整个数组并计算 (arr[i] > arr[i+1]%n) 的元素数。如果计数为"1",则返回 True,否则返回 False。
  • 返回输出。

示例

#include <bits/stdc++.h>
using namespace std;
bool checkSortedandRotated(int * arr, int n) {
   int count = 0;
   for (int i = 0; i < n; i++) {
      if (arr[i] > arr[(i + 1) % n])
         count++;
   }
   return (count <= 1);
}
int main() {
   int arr[] = {5,6,7,1,2,3,4};
   int n = sizeof(arr) / sizeof(int);
   if (checkSortedandRotated(arr, n)) {
      cout << "True" << endl;
   } else {
      cout << "False" << endl;
   }
   return 0;
}

运行上述代码将生成如下输出:

输出

True

由于给定的数组 [5, 6, 7, 1, 2, 3, 4] 已排序并从第 3 个位置开始旋转,因此在本例中我们得到的输出为"True"。


相关文章