• 某数组里存在乱序的正负数字,要求将负数放到左边,正数放到右边,并且正负数的相对位置不改变


    先说下思路:

      1、先遍历数组,将正负数的个数求出来,当然,如果存在零值,也需要求出个数来

      2、根据之前求出的个数分别申请两个数组,用来存放正负数

      3、再次遍历数组,将正负数放进第二步申请的两个数组中,零值需要排除在外

      4、将第三步得到的两个数组再填回原始数组(也可以再申请一个数组存放结果)

      完成!

    以下是代码(vs2013,64位win8):

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     //定义一个原始数组
     7     int arra[] = { -1, 3, 9, 0, -5, -20, -3, 4, 0, 8, -12, 7 };
     8     int nummin = 0, nummax = 0, i = 0, j = 0;//nummin用于存储小于零的数字个数,
     9                                             //nummax用于存储大于零的数字个数,i, j用来循环遍历
    10     bool zeroflag = false;//原始数组中是否有零的存在
    11     int zerocount = 0;//如果原始数组中存在多个零,则求出具体个数
    12 
    13     //先打印一把原始数组
    14     for (int i = 0; i < 12; i++)
    15     {
    16         cout << arra[i] << " ";
    17     }
    18     cout << endl;
    19 
    20     //遍历原始数组,分别求出大于零的数字个数和小于零的数字个数,以及是否存在零值
    21     for (i = 0; i < 12; i++)
    22     {
    23         if (arra[i] > 0)
    24         {
    25             nummax++;
    26         }
    27         else if (arra[i] < 0)
    28         {
    29             nummin++;
    30         }
    31         else
    32         {
    33             zeroflag = true;
    34             zerocount++;
    35         }
    36     }
    37     //根据求出的正负数数量分别申请两个数组用于分别存放正负数
    38     int *arrmin = (int*)malloc (sizeof(int) * nummin);
    39     int *arrmax = (int*)malloc(sizeof(int) * nummax);
    40     int k = 0, m = 0;//用于遍历赋值时作为两个数组的下标
    41 
    42     //顺序遍历原是数组,将正负数分别填进两个数组,并没有发生大小比较,
    43     // 所以正负数的相对位置并没有发生改变,并且将零值排除出来了
    44     for (i = 0; i < 12; i++)
    45     {
    46         if (arra[i] > 0)
    47         {
    48             arrmax[k] = arra[i];
    49             k++;
    50         }
    51         else if (arra[i] < 0)
    52         {
    53             arrmin[m] = arra[i];
    54             m++;
    55         }
    56     }
    57 
    58     //正负数已经分好,现在将两个数组再填回原始数组,当然也可以重新申请一个数组来保存结果
    59     for (i = 0; i < nummin; i++)//先将负数填进去
    60     {
    61         arra[i] = arrmin[i];
    62     }
    63 
    64     if (zeroflag)//如果存在零值
    65     {
    66         //按照得到的零值个数将数组中负数后面填上0
    67         for (i = 0; i < zerocount; i++)
    68         {
    69             arra[nummin + i] = 0;
    70         }
    71 
    72         //填完零之后紧接着就将正数填进去
    73         for (int n = 0; n < nummax; n++)
    74         {
    75             arra[nummin + n + zerocount] = arrmax[n];
    76         }
    77     }
    78     else    //如果不存在零值
    79     {
    80         //直接在负数后面添加正数即可
    81         for (int n = 0; n < nummax; n++)
    82         {
    83             arra[nummin + n] = arrmax[n];
    84         }
    85     }
    86 
    87     //打印结果
    88     for (int i = 0; i < 12; i++)
    89     {
    90         cout << arra[i] << " ";
    91     }
    92     cout << endl;
    93 
    94     return 0;
    95 }

    运行结果:

  • 相关阅读:
    MOS
    1- Bluetooth开发
    1- Bluetooth
    MCU 51-10 Infrared Communication
    1- STM32 HAL库学习 GPIO配置点亮LED灯
    MCU 51-9 DS18B20 Temperature Sensor
    MCU 51-8 AD/DA
    C语言讲义——变量(variable)
    C语言讲义——注释
    C语言讲义——“编译、链接”
  • 原文地址:https://www.cnblogs.com/leisc/p/3836863.html
Copyright © 2020-2023  润新知