如何反转 C 中数组中非负整数的运行?
How do I reverse runs of nonnegative integers in an array in C?
我需要在 C 中创建一个随机数组,在其中找到非负值,当至少有 2 个连续时,将它们反转。例如,如果我有随机数组 5 6 -7 -8 9 -4 7 8 2 -2
,我需要得到 6 5 -7 -8 9 -4 2 8 7 -2
。这是我到目前为止尝试过的:
#include <stdio.h>
#include <stdlib.h>
int ARRAY[100];
int main(void) {
int i;
int nn;
int temp = ARRAY[i];
rand();
for (i=0; i<100; ARRAY[i++]=rand()%100-50 );
printf("FIRST ARRAY:\n");
for (i=0; i<100; i++)
printf("%3d ",ARRAY[i]);
putchar('\n');
putchar('\n');
for(i=0; i<100; i++){
if (ARRAY[i]<0) {
if(!nn) {
nn = 1;
}
}
else {
temp=ARRAY[i];
ARRAY[i] = ARRAY[nn - 1];
ARRAY[nn - 1] = temp;
}
}
printf("Result:\n");
putchar('\n');
for (i=0; i<100; printf("%3d ",ARRAY[i++]));
putchar('\n');
return 0;
}
但是运气不好。
对于初学者来说,不需要全局声明数组
int ARRAY[100];
也永远不要使用像 100
这样的幻数。使用命名常量。
除常量外,变量的命名全是大写字母是一种糟糕的编程风格。
您可以编写一个单独的函数,如下面的演示程序所示。
#include <stdio.h>
void reverse_non_negative( int a[], size_t n )
{
for (size_t i = 0; i < n; )
{
while (i < n && a[i] < 0) i++;
size_t j = i;
while (i < n && !( a[i] < 0 )) i++;
for (size_t k = 0; k < ( i - j ) / 2; k++)
{
int tmp = a[j + k];
a[j + k] = a[i - k - 1];
a[i - k - 1] = tmp;
}
}
}
int main()
{
int a[] = { 5, 6, -7, -8, 9, -4, 7, 8, 2, -2 };
const size_t N = sizeof( a ) / sizeof( *a );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
reverse_non_negative( a, N );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
程序输出为
5 6 -7 -8 9 -4 7 8 2 -2
6 5 -7 -8 9 -4 2 8 7 -2
一个更通用的方法可以看下面的方式
#include <stdio.h>
void reverse_sub_ranges( int a[], size_t n, int predicate( int ) )
{
for (size_t i = 0; i < n; )
{
while (i < n && !predicate( a[i] )) i++;
size_t j = i;
while (i < n && predicate( a[i] )) i++;
for (size_t k = 0; k < ( i - j ) / 2; k++)
{
int tmp = a[j + k];
a[j + k] = a[i - k - 1];
a[i - k - 1] = tmp;
}
}
}
int non_negative( int value )
{
return !( value < 0 );
}
int main()
{
int a[] = { 5, 6, -7, -8, 9, -4, 7, 8, 2, -2 };
const size_t N = sizeof( a ) / sizeof( *a );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
reverse_sub_ranges( a, N, non_negative );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
程序输出与上图相同,即
5 6 -7 -8 9 -4 7 8 2 -2
6 5 -7 -8 9 -4 2 8 7 -2
我需要在 C 中创建一个随机数组,在其中找到非负值,当至少有 2 个连续时,将它们反转。例如,如果我有随机数组 5 6 -7 -8 9 -4 7 8 2 -2
,我需要得到 6 5 -7 -8 9 -4 2 8 7 -2
。这是我到目前为止尝试过的:
#include <stdio.h>
#include <stdlib.h>
int ARRAY[100];
int main(void) {
int i;
int nn;
int temp = ARRAY[i];
rand();
for (i=0; i<100; ARRAY[i++]=rand()%100-50 );
printf("FIRST ARRAY:\n");
for (i=0; i<100; i++)
printf("%3d ",ARRAY[i]);
putchar('\n');
putchar('\n');
for(i=0; i<100; i++){
if (ARRAY[i]<0) {
if(!nn) {
nn = 1;
}
}
else {
temp=ARRAY[i];
ARRAY[i] = ARRAY[nn - 1];
ARRAY[nn - 1] = temp;
}
}
printf("Result:\n");
putchar('\n');
for (i=0; i<100; printf("%3d ",ARRAY[i++]));
putchar('\n');
return 0;
}
但是运气不好。
对于初学者来说,不需要全局声明数组
int ARRAY[100];
也永远不要使用像 100
这样的幻数。使用命名常量。
除常量外,变量的命名全是大写字母是一种糟糕的编程风格。
您可以编写一个单独的函数,如下面的演示程序所示。
#include <stdio.h>
void reverse_non_negative( int a[], size_t n )
{
for (size_t i = 0; i < n; )
{
while (i < n && a[i] < 0) i++;
size_t j = i;
while (i < n && !( a[i] < 0 )) i++;
for (size_t k = 0; k < ( i - j ) / 2; k++)
{
int tmp = a[j + k];
a[j + k] = a[i - k - 1];
a[i - k - 1] = tmp;
}
}
}
int main()
{
int a[] = { 5, 6, -7, -8, 9, -4, 7, 8, 2, -2 };
const size_t N = sizeof( a ) / sizeof( *a );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
reverse_non_negative( a, N );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
程序输出为
5 6 -7 -8 9 -4 7 8 2 -2
6 5 -7 -8 9 -4 2 8 7 -2
一个更通用的方法可以看下面的方式
#include <stdio.h>
void reverse_sub_ranges( int a[], size_t n, int predicate( int ) )
{
for (size_t i = 0; i < n; )
{
while (i < n && !predicate( a[i] )) i++;
size_t j = i;
while (i < n && predicate( a[i] )) i++;
for (size_t k = 0; k < ( i - j ) / 2; k++)
{
int tmp = a[j + k];
a[j + k] = a[i - k - 1];
a[i - k - 1] = tmp;
}
}
}
int non_negative( int value )
{
return !( value < 0 );
}
int main()
{
int a[] = { 5, 6, -7, -8, 9, -4, 7, 8, 2, -2 };
const size_t N = sizeof( a ) / sizeof( *a );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
reverse_sub_ranges( a, N, non_negative );
for (size_t i = 0; i < N; i++)
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
程序输出与上图相同,即
5 6 -7 -8 9 -4 7 8 2 -2
6 5 -7 -8 9 -4 2 8 7 -2