在C++中,使用O(1)额外空间重新排列数组,使正负项交替出现

在c++中,使用o(1)额外空间重新排列数组,使正负项交替出现

我们得到一个包含正数和负数的整数类型数组,比方说,任意给定大小的 arr[] 。任务是重新排列一个数组,使得正数被负数包围。如果有更多的积极和负数将被排列在数组的末尾。

让我们看看不同的输入输出情况 −

输入 − int arr[] = {-1, -2, -3, 1, 2, 3}

输出 − 排列前的数组:-1 -2 -3 1 2 3重新排列一个数组,使正负项交替出现,并且不需要额外的空间是:-1 1 -2 2 -3 3。

解释:给定一个大小为6的整数数组,其中包含正负元素。现在,我们将重新排列数组,使所有正元素都出现在负元素之前,且不需要额外的空间被负元素和所有额外元素所包围,最终数组的末尾将添加-1 1 -2 2 -3 3,即为最终结果。

输入 – int arr[] = {-1, -2, -3, 1, 2, 3, 5, 5, -5, 3, 1, 1};

输出 – 排列前的数组:-1 -2 -3 1 2 3 5 5 -5 3 1 1将数组按交替正负项重新排列,不使用额外空间的时间复杂度为O(1):-1 1 -2 2 -3 3 -5 5 5 3 1 1

解释 – 我们给出一个大小为12的整数数组,包含正负元素。现在,我们将按照这样的方式重新排列数组,使得所有正元素被负元素包围,并将所有额外的元素添加到数组的末尾,即-1 1 -2 2 -3 3 -5 5 5 3 1 1将是最终结果。

下面程序中使用的方法如下

输入一个整数类型的数组并计算数组的大小。

立即学习“C++免费学习笔记(深入)”;

使用FOR循环打印执行重新排列操作之前的数组。

通过传递数组和数组大小作为参数调用函数Rearrangement(arr, size)。

在函数Rearrangement(arr, size)内部

声明一个整数变量’ptr’并将其初始化为-1。

从i到0的循环,直到i小于size。在循环内部,检查如果ptr大于0,然后检查如果arr[i]大于0且arr[ptr]小于0或arr[i]小于0且arr[ptr]大于0,则调用函数move_array(arr, size, ptr, i),并检查如果i – ptr大于2,则将ptr设置为ptr + 2。否则,将ptr设置为-1。

检查如果ptr等于-1,则检查arr[i]大于0且!(i & 0x01)或(arr[i]小于0)且(i & 0x01),然后将ptr设置为i。

在函数move_array(int arr[], int size, int ptr, int temp)内部

声明一个名为’ch’的字符类型变量,并将其设置为arr[temp]。

从i到temp的循环,直到i大于ptr。在循环内部,将arr[i]设置为arr[i – 1]。

将arr[ptr]设置为ch。

示例

#include #include using namespace std;void move_array(int arr[], int size, int ptr, int temp){   char ch = arr[temp];   for(int i = temp; i > ptr; i--){      arr[i] = arr[i - 1];   }   arr[ptr] = ch;}void Rearrangement(int arr[], int size){   int ptr = -1;   for(int i = 0; i = 0){         if(((arr[i] >= 0) && (arr[ptr] < 0)) || ((arr[i] = 0))){            move_array(arr, size, ptr, i);            if(i - ptr >= 2){               ptr = ptr + 2;            }            else{               ptr = -1;            }         }      }      if(ptr == -1){         if (((arr[i] >= 0) && (!(i & 0x01))) || ((arr[i] < 0) && (i & 0x01))){            ptr = i;         }      }   }}int main(){   //input an array   int arr[] = {-1, -2, -3, 1, 2, 3};   int size = sizeof(arr) / sizeof(arr[0]);   //print the original Array   cout<<"Array before Arrangement: ";   for (int i = 0; i < size; i++){      cout << arr[i] << " ";   }   //calling the function to rearrange the array   Rearrangement(arr, size);   //print the array after rearranging the values   cout<<"nRearrangement of an array in alternating positive & negative items with O(1) extra space is: ";   for(int i = 0; i < size; i++){      cout<< arr[i] << " ";   }   return 0;}

输出

如果我们运行上面的代码,它将生成以下输出

Array before Arrangement: -1 -2 -3 1 2 3Rearrangement of an array in alternating positive & negative items with O(1) extra space is: -1 1 -2 2 -3 3

以上就是在C++中,使用O(1)额外空间重新排列数组,使正负项交替出现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:18:19
下一篇 2025年12月14日 03:03:07

相关推荐

  • 解释C语言中变量的生命周期

    存储类指定变量的范围、生命周期和绑定。 要完整定义变量,不仅需要提及其“类型”,还需要提及其存储类。 变量名称标识计算机内存中的某个物理位置,其中分配了一组位来存储变量的值。 存储类别告诉我们以下因素 – 变量存储在哪里(内存或CPU寄存器中)?如果没有初始化,变量的初始值是多少? 变量…

    2025年12月17日
    000
  • 在C语言中编写一个打印正方形内嵌正方形的程序

    程序描述 按照下面所示的方式打印一个正方形内的另一个正方形 算法 Accept the number of rows the outer Square to be drawnDisplay the Outer Square with the number of rows specified by t…

    2025年12月17日
    000
  • C语言中的字符串字面值是什么?

    字符串文字是一个以零结尾的字符序列。例如, Char * str = “hi, hello”; /* string literal */ 字符串字面量用于初始化数组。 char a1[] = “xyz”; /* a1 is char[4] holding {‘x’,’y’,’z’,”} */cha…

    2025年12月17日
    000
  • 如何使用C语言将二进制转换为十六进制?

    二进制数以 1 和 0 表示。 16 位的十六进制数系统为 {0,1,2,3…..9, A(10), B(11),… …F(15)} 为了从二进制表示转换为十六进制表示,位串 id 被分组为 4 位块,从最低有效侧开始称为半字节。每个块都替换为相应的十六进制数字。 让我们看一个示例,以清楚地了解十六…

    2025年12月17日
    000
  • 在C++中实现strtok()函数

    strtok()函数是C++中最常用的函数之一。使用分隔符作为指导,该函数可以将文本分割成较小的块或标记。由于strtok()函数的存在,使用字符串在C++中变得简单。本文将对strtok()函数进行详细的讲解,包括其定义、语法、算法和各种实现策略。需要记住的是,strtok函数有一些限制和潜在的缺…

    2025年12月17日
    000
  • 使用C++找到图中的汇节点的数量

    在本文中,我们将描述解决图中汇节点数量的重要信息。在这个问题中,我们有一个有 N 个节点(1 到 N)和 M 个边的有向无环图。目标是找出给定图中有多少个汇节点。汇聚节点是不产生任何传出边的节点。这是一个简单的例子 – Input : n = 4, m = 2Edges[] = {{2,…

    2025年12月17日
    000
  • 使用C++移除给定数字中的重复数字

    在本文中,我们给出了一个数字 n,我们需要删除给定数字中的重复数字。 Input: x = 12224Output: 124Input: x = 124422Output: 1242Input: x = 11332Output: 132 在给定的问题中,我们将遍历所有数字并删除重复的数字。 寻找解决…

    2025年12月17日
    000
  • 如何在C语言中将数组中的单个元素作为参数传递给函数?

    如果要将单个元素作为参数传递,则在函数调用中必须给出数组元素及其下标。 为了接收这些元素,在函数定义中使用简单变量。 示例1 #includemain (){ void display (int, int); int a[5], i; clrscr(); printf (“enter 5…

    2025年12月17日
    000
  • 检查输入字符是字母、数字还是特殊字符在C中

    在本节中,我们将了解如何检查给定字符是数字、字母还是 C 中的某些特殊字符。 字母表是从 A – Z 和 a – z,然后数字为 0 – 9。所有其他字符均为特殊字符。因此,如果我们使用这些条件检查条件,我们可以轻松找到它们。 示例 #include #include main() { char c…

    2025年12月17日
    000
  • 当在C/C++中的数字常量前加上0时,这意味着它是一个八进制数

    有时我们可能会看到一些数字文字,其前缀为0。这表明该数字是八进制数。所以八进制文字在开头包含 0。例如,如果八进制数是 25,那么我们必须写 025。 示例 #include int main() { int a = 025; int b = 063; printf(“Decimal of 25(O…

    2025年12月17日
    000
  • 在C程序中,将等边三角形内切圆的面积计算出来

    在这里我们将看到等边三角形内切圆的面积。三角形的边是“a”。 等边三角形的面积 – 三角形的半周长是 – 所以圆的半径是 – 示例 #include #include using namespace std;float area(float a) { if (a …

    2025年12月17日 好文分享
    000
  • C/C++程序中的数组

    数组是一组固定数量的相同数据类型的项目。这些元素存储在内存中的连续内存位置中。 可以使用方括号“[]”和数组名称像a[4]、a[3]等从其索引值访问值的每个单个元素。 声明数组 在c/c++编程语言中,通过定义数组的类型和长度(元素数量)来声明数组。下面的语法显示了在c/c++中声明数组的方法− d…

    2025年12月17日
    000
  • 解释C语言中选择排序的过程

    选择排序是一种攻击性算法,用于从数组中找到最小的数字,然后将其放置到第一个位置。下一个要遍历的数组将从索引开始,靠近放置最小数字的位置。 选择排序的过程 选择元素列表中第一个最小的元素并将其放置在第一个位置。 对列表中的其余元素重复相同的操作,直到所有元素都获得已排序。 考虑以下列表 –…

    2025年12月17日 好文分享
    000
  • 使用C++编写,找到子数组中的质数数量

    在本文中,我们将描述查找子数组中素数数量的方法。我们有一个正数数组 arr[] 和 q 个查询,其中有两个整数表示我们的范围 {l, R},我们需要找到给定范围内的素数数量。下面是给定问题的示例 – Input : arr[] = {1, 2, 3, 4, 5, 6}, q = 1, L…

    2025年12月17日
    000
  • 重新排列一个数组,使得每个奇数索引的元素都大于其前一个元素

    我们有一个正整数类型的数组,假设为arr[],大小任意。任务是重新排列数组,使得所有奇数索引位置的元素的值大于偶数索引位置的元素,并打印结果。 让我们看看各种输入输出情况: 输入 − int arr[] = {2, 1, 5, 4, 3, 7, 8} 输出 − 排列前的数组:2 1 5 4 3 7 …

    2025年12月17日
    000
  • 在C语言中编写一个打印反向Floyd三角形的程序

    程序描述 弗洛伊德三角形是自然数的直角三角形数组,用于计算机科学教育。它以罗伯特·弗洛伊德的名字命名。它是通过用连续的数字填充三角形的行来定义的,从左上角的 1 开始 1 15 14 13 12 112 3 10 9 8 74 5 6 6 5 47 8 9 10 3 211 12 13 14 15 …

    2025年12月17日
    000
  • 在C++中的可重构数

    给定一个整数类型的值,假设为number。任务是检查给定的数字是否可重构。如果是,打印该数字是可重构数字,否则打印不可能。 什么是可重构数字? 当一个数字可以被其可用因子的总数整除时,它就是可重构的。例如,数字9是可重构的,因为它有3个因子(1、3、9),而9可以被3整除,因此它是一个可重构数字。 …

    2025年12月17日
    000
  • 计算菱形的面积和周长的程序,已知对角线是什么?在C++中,什么是菱形?

    什么是菱形? 在几何学中,菱形是四个边长相同的四边形。菱形与形状菱形相似。如果菱形的对角线成直角,那么它就变成正方形。 菱形的性质是 – 边相等对边平行,对角相等,是平行四边形对角线平分直角 下图是菱形 立即学习“C++免费学习笔记(深入)”; 问题 给定对角线,假设 d1 和 d2 的…

    2025年12月17日
    000
  • 使用C++反转一个双向链表

    在本文中,我们有一个双向链表,我们将解释在 C++ 中反转双向链表的不同方法。例如 – Input : {1, 2, 3, 4}Output : {4, 3, 2, 1} 通常会想到一种方法,但我们将使用两种方法 – 正常方法和非正统方法。 正常方法 在这种方法中,我们将经历…

    2025年12月17日
    000
  • C令牌是什么?

    这个C程序是一系列指令,每个指令都是一系列个体单元的集合。 C程序中的每个小个体单元通常被称为令牌,C程序中的每个指令都是令牌的集合。 令牌用于构建C程序,它们也被称为C程序的基本构建块。 在C程序中,令牌包含以下内容: 关键字标识符运算符特殊符号常量字符串数据值 在C程序中,所有这些关键字、标识符…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信