Bootstrap

数组去重类问题⭐

问题描述(难度⭐)

读取多组数据,对每组数据进行冒泡排序,然后去除重复元素后输出。

输入

首先输入一个正整数T(0<T<20)

对于每组数据,首先输入一个正整数n(0<n<100)表示有n个数,然后输入n个整数(均在int范围内)

输出

对于每一组数据,将这n个整数升序排列,然后输出,要求同一数字仅输出一次,数字间用空格隔开。每组输出单独占一行。

样例

输入         5                        输出     1 2 3

                 3 2 2 1 1


代码思路

  1. 读取测试用例数量

    • 使用 scanf 读取一个整数 T,表示测试用例的数量。
  2. 处理每个测试用例

    • 使用 while 循环,循环 T 次,每次处理一个测试用例。
    • 在每次循环中:
      • 读取一个整数 n,表示当前测试用例中数组的长度。
      • 声明一个长度为 n 的整数数组 arr
      • 使用 for 循环读取 n 个整数,存储到数组 arr 中。
  3. 调用冒泡排序函数

    • 调用 bubble 函数对数组 arr 进行冒泡排序。
  4. 去除重复元素并输出

    • 使用 for 循环遍历数组 arr 的前 n-1 个元素:
      • 如果当前元素 arr[i] 与下一个元素 arr[i+1] 不相等,则输出当前元素 arr[i]
      • 最后输出数组的最后一个元素 arr[n-1]
  5. 冒泡排序函数 bubble

    • 使用两个嵌套的 for 循环实现冒泡排序:
      • 外层循环从 n-1 递减到 1,表示每次排序的范围。
      • 内层循环从 0 到 i-1,用于比较相邻元素。
      • 如果当前元素 arr[j] 大于下一个元素 arr[j+1],则交换这两个元素。

详细代码 (C语言版)

#include<stdio.h>
#include<string.h>

// 函数声明
void bubble(int arr[], int n);

int main() {
    int T;
    scanf("%d", &T);  // 读取测试用例数量
    while (T--) {
        int n;
        scanf("%d", &n);  // 读取当前测试用例的数组长度
        int arr[n];  // 声明数组
        for (int i = 0; i < n; i++) {
            scanf("%d", &arr[i]);  // 读取数组元素
        }
        bubble(arr, n);  // 调用冒泡排序函数
        // 先遍历n-1个元素输出
        for (int i = 0; i < n - 1; i++) {
            if (arr[i] != arr[i + 1]) {  // 如果当前元素与下一个元素不相等
                printf("%d ", arr[i]);  // 输出当前元素
            }
        }
        // 输出最后一个元素
        printf("%d\n", arr[n - 1]);
    }
    return 0;
}

// 冒泡排序函数
void bubble(int arr[], int n) {
    for (int i = n - 1; i > 0; i--) {  // 外层循环,从n-1递减到1
        for (int j = 0; j < i; j++) {  // 内层循环,从0到i-1
            if (arr[j] > arr[j + 1]) {  // 如果当前元素大于下一个元素
                int mid = arr[j];  // 交换两个元素
                arr[j] = arr[j + 1];
                arr[j + 1] = mid;
            }
        }
    }
}

;