删除重复数字的三种方法(详解)

文章介绍了三种去除整数序列中重复数字的方法,包括覆盖法(暴力求解,通过冒泡排序和覆盖来去重),简单方法(利用数字作为数组下标存储并打印非零值),以及双指针法。覆盖法中详细解释了去重过程和处理连续重复数字的逻辑。
摘要由CSDN通过智能技术生成

前言:本期是关于去重数字的三种方法详解,今天你c了吗?

输入描述:

第一行,输入一个整数n,表示序列有n个整数。

第二行输入n个整数(每个整数大于等于1,小于等于1000),整数之间用空格分隔。

输出描述:

去重并且从小到大排列的整数序列,整数之间用空格分隔。

示例1

输入:

6
5 3 3 4 2 2

输出:

2 3 4 5

方法一:覆盖法(暴力求解)

代码实现:

 int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[1000] = { 0 };
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    //冒泡排序
    for (i = 0; i < n - 1; i++)
    {
        int j = 0;
        for (j = 0; j < n - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    //去重
    for (i = 0; i < n - 1; i++)
    {
        if (arr[i] == arr[i + 1])
        {
            int k = 0;
            for (k = i; k < n - 1; k++)
            {
                arr[k] = arr[k + 1];
            }
            n--;
            i--;
        }
    }
    //打印
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

思路:

 1. 将无序数组变成有序数组(这里使用冒泡排序,点击即跳转我另一篇博客的详解)

 2. 两两进行比较,若是二者值相同,则出现了重复数字,用后者覆盖前者,覆盖后相当于删除了一个重复数字,数字个数-1 

 3. 需要对新覆盖上来的数字再和它后一位数字进行比较,比如出现连续3个及以上的重复数字

代码解读:详解去重部分

已经实现过数组排序

   for (i = 0; i < n - 1; i++)
    {
        if (arr[i] == arr[i + 1])
        {
            int k = 0;
            for (k = i; k < n - 1; k++)
            {
                arr[k] = arr[k + 1];
            }
            n--;
            i--;
        }
    }

 以如下为例

示例1

输入:

6
5 3 3 4 2 2

输出:

2 3 4 5

1.数字之间两两比较,6个数字共需比较5次,故而n个数字,需比较n-1次

   这里的for循环用于实现比较的次数

 for (i = 0; i < n - 1; i++)

      

2.for循环内部:两个数字之间的一次比较

        if (arr[i] == arr[i + 1])
        {
            int k = 0;
            for (k = i; k < n - 1; k++)
            {
                arr[k] = arr[k + 1];
            }
            n--;
            i--;
        }

      若是两个数字相同,则出现重复数字,需要去重,用后者覆盖前者

      如  5 3 3 4 2 2,经过前面的冒泡排序后,变成:2 2 3 3 4 5

      假设现在比较的是2 2 两个数字,需要进行去重,操作如下:

       从第二个2开始的全部数字往前移动一位

       移动完成后删重成功,数字个数-1

      注意特殊情况:出现连续的3个及以上的重复数字,如 2 2 2 3 3 4 5

                               第一个2和第二个2经过去重后,数组变成:2 2 3 3 4 5

       原本比较完第一个元素和第二个元素后,下一次是比较第二个元素和第三个元素

       但是第二个元素是2,第三个元素是3,我们漏掉了新的第一个元素2和第二个元素2的比较

       2和3不同,不去重,下一次再比较3和3,进行去重后数组变成:2 2 3 4 5

 故而:我们在每一次去重后,都需要对新覆盖上来的数字(原本是两两比较的重复数字中的第二个数)和它后面的一个数进行再次比较

操作是:i--

形象一点:假设一个数字的下标为2,一个数字的下标为3,此时的i=2,i+1=3

                  本来这轮的两个数字去重后,马上要进行的是下一对的比较

                   在进入下一对的比较之前,i--,相当于退后一步,然后i++,进入下一对比较

                    效果是:先退一步再前进一步=原地不动

                  原本 下一轮要比较的两个数字的下标为3和下标为4,但是在这之前i--(退后一步)

                    i:2-1=1,i变成了下标1,i++,i:1+1=2,此时i还是下标2,又可以对下标为2的数字

                   和下标为3的数字进行再次比较

方法二:简单

代码实现:

int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[1001] = { 0 };
    int input = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &input);
        arr[input] = input;
    }
    for (i = 0; i < 1001; i++)
    {
        if (arr[i] != 0)
        {
            printf("%d ", arr[i]);
        }
    }
    return 0;
}

思路: 

1.将每一个数字作为下标,将其对应的数组空间内置成数字的值

2. 打印数组中不为0的值

如:5 3 3 4 2 2

002345
下标012345

两个重复的数字3和2存入数组中,在下标为3和下标为2的空间中存了一个3和一个2的值

初始化数组的内容全部为0,最后打印不为0的值

方法三:双指针 

在我主页搜索 “在数组中删除重复数字” 关键字即可查看

不发链接是因为总是失效

  • 57
    点赞
  • 210
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
IGBT(Insulated Gate Bipolar Transistor)是一种高压、高电流功率开关设备,常用于交流电驱动、电动机控制等领域。下面详细介绍三种IGBT驱动电路和保护方法。 1.单级驱动电路:单级驱动电路简单且成本较低,适用于低频率应用。它由一个电流放大器和一个电压放大器组成。电流放大器负责把输入信号放大,将信号源电流转化为足够大的控制电流,用于驱动IGBT。电压放大器负责保持稳定的驱动电压,以确保IGBT的正常工作。 2.双级驱动电路:双级驱动电路在单级驱动电路的基础上增加了一个电流转换阶段。该电路通过减小驱动引脚的电容负载,提高了驱动电流的上升速度和下降速度,从而减少了开关损耗和过热现象。同时,双级驱动电路还能够提供增强的瞬态驱动能力,以便快速改变IGBT的状态。 3.光耦隔离驱动电路:光耦隔离驱动电路通过光学耦合器来实现输入和输出的隔离,确保控制信号与高压高电流环境完全隔离。该电路具有良好的电气隔离性能,并能适应复杂的工作环境,有效降低了电磁干扰和噪音。 在IGBT的保护方面,常见的方法包括: 1.过电流保护:通过监测驱动电流大小,当电流超过设定阈值时,及时停止驱动信号,避免IGBT受到过大的电流冲击。 2.过温保护:通过监测IGBT芯片温度,当温度超过设定阈值时,自动切断电源供应,防止IGBT因过热而损坏。 3.过压保护:通过监测输入电压大小,当电压超过设定阈值时,自动切断电源供应,保护IGBT不受过高电压的损害。 综上所述,IGBT驱动电路和保护方法是确保IGBT正常工作和提高设备可靠性的关键。不同的应用场景可以选择合适的驱动电路和保护方法来满足需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值