C 语言将所有负数移到数组的一侧17 Mar 2025 | 6 分钟阅读 数组是同质的。整数数组可以容纳负值、正值或零。我们需要重新排列数组的元素,使所有负元素都移到数组的一侧,要么在开头,要么在末尾。这里元素的顺序并不重要。 这是最常被问到的面试问题之一,并且有很多方法可以解决它。本教程列出了所有可能的方法及示例。 例如,如果我们给出一个数组 ![]() 结果数组可以是
注意:顺序不必考虑。关键是将所有负数移到一侧。听到这个问题时,首先想到的方法是朴素的方法——对数组进行排序。 如果我们按升序对数组进行排序,所有负元素都会堆积在数组的开头,如果我们按降序排序,所有元素都会堆积在末尾。 我们可以使用任何排序算法来执行排序。我们以选择排序为例 在选择排序算法中,对于数组中的每个元素 i,我们将在 i+1 到数组末尾的子数组中找到最小元素,然后交换这两个值来对数组进行排序。 代码 输出 Enter the size of the Array: 5 Enter the elements: 5 -8 3 -9 2 The final Array: -9 -8 2 3 5 如果我们采用这种方法,时间复杂度为 O(n2),其中 n 是数组的长度。 现在,让我们关注更有效的方法。 我们在上面的方法中使用了嵌套的 for 循环,这增加了时间复杂度。我们需要一种方法来在一遍遍历数组的情况下完成过程。 1. 使用分区方法在此方法中,我们遍历数组,一旦找到负数,就将其放在数组的开头或末尾。 代码 输出 Enter the size of the Array: 6 Enter the elements: 1-3 2 -5 -6 -1 The resultant Array: -3 -5 -6 -1 2 1 理解 在上面的代码中,我们声明了一个变量 j = 0。arr[j] 位于数组的开头。现在,我们使用 i 遍历数组,在每次迭代中,我们检查 arr[i] 是否为负数。如果 arr[i] 为负数,我们将其与 arr[j] 交换,将其移到数组的开头。然后,我们增加 j 的值并继续该过程。 例如 假设给定的数组是 ![]() 第一次迭代 -> j = 0, i = 0 -> arr[0] 是正数 第二次迭代 -> j = 0, i = 1 -> arr[1] 是负数,且 i != j 所以交换 arr[0] <-> arr[1] ![]() 第三次迭代 -> j = 1, i = 2 -> arr[2] 是正数 第四次迭代 -> j = 1, i = 3 -> arr[3] 是负数,且 i != j 所以交换 arr[1] <-> arr[3] ![]() 第五次迭代 -> j = 2, i = 4 -> arr[4] 是负数,且 i != j 所以交换 arr[2] <-> arr[4] ![]() 第六次迭代 -> j = 3, i = 5 -> arr[5] 是负数,且 i != j,所以交换 arr[3] <-> arr[5] ![]() 时间复杂度:O(n),其中 n 是数组的大小 2. 使用指针/变量在此方法中,我们使用两个指针或变量,例如,a 指向数组的开头,b 指向数组的末尾。我们将通过递增 a 和递减 b 来检查数组中的元素。 将所有负值移到开头,所有正值移到末尾 算法
代码 输出 Enter the size of the Array: 6 Enter the elements: 1 -3 4 -2 4 -3 The resultant Array: -3 -3 -2 4 4 1 3. 荷兰国旗算法由 Dijkstra 提出,给定 n 个红、白、蓝球以随机顺序排列,我们需要将所有球排列起来,使相同颜色的球都相邻。这些球组的顺序必须是给定的顺序,也就是说,在所有红球之后是白球,然后是蓝球。 我们像上面方法一样从两边缩小数组。这段代码就像上面方法的简化版。 代码 输出 Enter the size of the Array: 6 Enter the elements: 4 -2 4 -1 -2 -5 The resultant Array: -5 -2 -2 -1 4 4 理解 注意,在上面的代码中,我们使用了与前一种方法相同的条件,但对其进行了进一步简化。 下一主题在 C 中反转数组 |
在本节中,我们将学习 C 语言编程中的 getchar() 函数。getchar() 函数是一个非标准函数,其含义已在 stdin.h 头文件中定义,用于从用户那里接受单个输入。换句话说,它是 C...
阅读 3 分钟
在 C 编程语言中,运算符是特殊符号,主要用于对给定的操作数执行各种数学和逻辑运算以返回正确的结果。C 语言中有各种运算符,例如算术运算符、关系运算符...
11 分钟阅读
C 语言的数学库中有许多函数可用于解决各种三角数学问题。这些功能使该语言成为针对科学界在各个领域创建程序的强大工具。atan2() 函数是众多函数之一……
阅读 4 分钟
memcpy()函数也称为复制内存块函数。它用于复制指定字符范围的副本。如果两个内存块不重叠,该函数只能将对象从一个内存块复制到另一个内存块...
阅读 6 分钟
内存管理是编程的重要组成部分,尤其是在 C 语言中。内存泄漏是 C 编程中一个常见的问题,它会导致程序消耗大量内存,最终可能导致系统崩溃或其他性能问题。在这...
阅读 4 分钟
什么是八进制数制?八进制数制是一种以 8 为基数的数制,其中基数 8 表示从 0 到 7 的八个数字。什么是十六进制数制?十六进制数制是一种以 16 为基数的数制,其中基数 16 表示……
5 分钟阅读
猜单词游戏是一个传统的猜词游戏,一个人想一个词,另一个人试图通过猜测字母来猜对。每猜错一次,就会画出类似于吊人的人的简笔画的一部分。目标是...
7 分钟阅读
使用预处理器指令和宏,可以在 C 程序中定义可重用代码片段。您可以创建跨越多行的更复杂的代码结构,并使用多行宏。在编写复合语句或将在整个代码中重复使用的代码块时,它们非常有用...
阅读 6 分钟
C程序 C程序: n 的阶乘是所有正数递减整数的乘积。 n 的阶乘用 n! 表示。例如: 5! = 5*4*3*2*1 = 120 3! = 3*2*1 = 6 在这里,5! 被读作“5 的阶乘”,它也称为...
阅读1分钟
结构体和联合体是C语言中许多用户定义数据类型中的两种。它们都很相似,但也有一些显著的区别。在本文中,我们将讨论这两种数据类型,并根据...来区分它们。
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India