分割数组中的 0 和 117 Mar 2025 | 5 分钟阅读 给定一个只有0和1随机排列的数组,任务是将所有0和1分开。我们可以将所有0排在前面,然后是1,或者将所有1排在前面,然后是0。本教程列出了从朴素方法到高效方法的所有可能方法来分离0和1的数组。 方法1:朴素方法:排序数组如果我们将数组按升序排序,我们会得到一个0在前,1在后的数组。对于1在前,0在后的数组,我们需要将数组按降序排序。 下面是一个遵循选择排序算法的示例代码 输出 Enter the size of the Array: 6 Enter the elements: 0 1 1 1 0 0 0 0 0 1 1 1 我们在这里使用了两个循环,一个用于选择数组中的元素,另一个用于查找数组中的最小元素。因此,时间复杂度为O(N2)。 方法2:两次遍历数组:计数在此方法中,我们将只遍历数组两次以降低时间复杂度。但我们该怎么做呢?我们将使用第一次遍历来计算数组中0的个数。通过从数组大小中减去0的个数,我们将得到1的个数。现在,我们将使用第二次遍历用0填充数组,然后是1。 示例代码 输出 Enter the size of the Array: 6 Enter the elements: 0 1 1 0 1 1 The resultant Array: 0 0 1 1 1 1 方法3:只遍历一次数组:双指针/变量在此方法中,我们使用两个变量或指针,一个从数组的开头开始,另一个从数组的末尾开始。如果我们正将0排在前面,然后是1,我们将使用两个变量检查右侧是否有0,左侧是否有1,并交换它们。 输出 Enter the size of the Array: 6 Enter the elements: 1 1 1 0 0 0 The resultant Array: 0 0 0 1 1 1 理解 在上面的代码中,我们有两个变量a和b,分别指向数组的开头和结尾。 这里的逻辑是,
方法4:只遍历一次数组:分区方法在此方法中,我们使用两个变量,就像上面的方法一样,但都从数组的开头开始。我们将使用一个变量(i)来遍历数组以查找0,使用变量(j)指向数组的开头。如果i找到一个0,我们将交换i和j处的元素,然后我们将增加j。为了说清楚,j是我们希望0占据的索引。 示例代码 输出 Enter the size of the Array: 6 Enter the elements: 1 1 0 0 1 1 The resultant Array: 0 0 1 1 1 1 理解 在上面的代码中,我们声明了一个变量j=0,arr[j]位于数组的开头。现在,我们使用i遍历数组,在每次迭代中,我们检查arr[i]是否为0。如果arr[i]为0,我们将其与arr[j]交换,以将其移到数组的开头。然后,我们增加j的值并继续该过程。 例如 ![]() 第一次迭代 -> j = 0, i = 0 -> arr[0]是1 第二次迭代 -> j = 0, i = 1 -> arr[1]是0,且i != j 所以交换 arr[0] <-> arr[1] ![]() j = j + 1 第三次迭代 -> j = 1, i = 2 -> arr[2]是1 第四次迭代 -> j = 1, i = 3 -> arr[3]是0,且i != j 所以交换 arr[1] <-> arr[3] ![]() 第五次迭代 -> j = 2, i = 4 -> arr[4]是0,且i != j 所以交换 arr[2] <-> arr[4] ![]() 第六次迭代 -> j = 3, i = 5 -> arr[5]是0,且i != j,所以交换 arr[3] <-> arr[5] ![]() 时间复杂度:O(n),其中n是数组的大小 下一个主题割点与桥 |
当其各位数字的阶乘之和等于该数字时,该数字可以被认为是强数。例如,145 是一个强数。让我们通过一个例子来理解。检查数字是否为强数的程序。#include <stdio.h> int main() { ...
阅读 4 分钟
在C编程中,处理输入和输出活动至关重要。Fgets()是可用的众多输入函数之一。借助这个强大的函数,开发人员可以安全准确地从给定流中读取信息。在本文中,我们将探讨...
阅读 3 分钟
3. 在这个程序中,我们需要将数组的元素向左旋转指定的次数。在左旋转中,数组的每个元素将向左移动一个位置,而数组的第一个元素将...
阅读 3 分钟
memmove() 函数将内存块从一个位置传输到另一个位置。该函数声明在 string.h 文件中。语法 memmove 函数的语法如下: void *memmove(void *strng1, const void *strng2, size_t n); 传递给函数的参数 strng1:它是指向内存的指针...
7 分钟阅读
memcpy()函数也称为复制内存块函数。它用于复制指定字符范围的副本。如果两个内存块不重叠,该函数只能将对象从一个内存块复制到另一个内存块...
阅读 6 分钟
在编程中,标签是帮助程序控制从一个函数跳转到另一个函数的关键字。在 C 语言中,我们使用 goto 函数来实现此功能。在 C 语言中,GCC 提供了标签或局部标签的概念,它实现了该功能...
5 分钟阅读
在 C 编程语言中,隐式类型转换是指编译器在程序执行期间将一种数据类型转换为另一种数据类型的过程。它也被称为自动类型转换。C 编程语言中的隐式类型转换通常称为……
阅读 10 分钟
字符串可以有两种方式进行比较:使用字符串函数或不使用字符串函数。首先,我们将看如何使用字符串函数(即 strcmp(),它定义在 string.h 头文件中)比较字符串。使用字符串函数进行字符串比较...
阅读 4 分钟
C 语言是最受欢迎的编程语言之一,它提供了一套全面的内置函数来有效地处理字符串。Strcpy() 函数就是这些重要函数之一。一个名为 strcpy() 的标准库方法使程序员能够将一个字符串复制到另一个字符串……
7 分钟阅读
在本主题中,我们将讨论C语言中的abs函数。abs()函数是stdlib.h头文件中的一个预定义函数,用于返回给定整数的绝对值。因此,如果我们想返回绝对值...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India