【蓝蓝计算机考研算法】-day09-求5个数的最值&ASCII码排序

305 阅读3分钟

13、5个数求最值

设计一个从5个整数中取最小数和最大数的程序

  • 输入:输入只有一组测试数据,为五个不大于1万的正整数
  • 输出:输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开。

思路

默认第一个元素为最大值和最小值。循环给数组赋值,然后循环做判断最最大最小。

具体实现

#include<stdio.h>
int main()
{
    int max, min;
    int num[5] = {};//定义一维数组大小为5并初始化
    for (int i = 0; i < 5; i++) {//循环赋值给数组
        scanf_s("%d", &num[i]);
   }
    max = num[0];//默认第一个为最大值
    min = num[0];//默认第一个为最小值
    for (int i = 0; i < 5; i++) {
        if (min > num[i]) {
                min = num[i];
        }
        if (max < num[i]) {
                max = num[i];
        }
    }
     printf("最大值和最小值为:%d %d", max,min);
    return 0;
   
}

运行结果

image.png

复杂度

  • 时间复杂度 O(n)--- 遍历数组比较元素大小,其中n为数组长度
  • 空间复杂度 O(1)---数组是题目要求输入的数组,且只用到有限个,除此仅有常熟级的变量

14、ASCII码排序

输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。

  • 输入: 第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格。
  • 输出: 对于每组输入数据,输出一行,字符中间用一个空格分开。

思路

  • 使用 if 语句进行条件判断,如果 a 大于 b,则借助于中间变量 temp 互换 a 与 b 值, 依此类推比较 a 与 c、b 与 c,最终结果即为 a、b、c 的升序排列。
  • 使用输出函数将 a、b、c 的值依次输出。

具体实现

#include<stdio.h>
int main()
{
    int num=0;//num表示有多少组测试数据
    printf("输入测试几组数据\n");
    scanf_s("%d\n", &num);
    while (num--) {
        char a, b, c, temp;    
        scanf_s(" %c %c %c", &a,1,&b,1,&c,1);//输入三个字符 利用空格避免第二次输入时候显示不全
        if (a > b) {/*如果a大于b,借助中间变量temp实现a与b值的互换*/
            temp = a;
            a = b;
            b = temp;
        }
        if (a > c) {
            temp = a;
            a = c;
            c = temp;
        }
        if (b > c) {
            temp = b;
            b = c;
            c = temp;
        }
        printf("小到大排序后:%c %c %c\n", a, b, c);    /*输出函数顺序输出a、b、c的值*/

    }
        return 0;   
}

运行结果

image.png

复杂度

  • 时间复杂度O(1)---除去输入数据所占用的时间,剩下仅为常数级,while循环也是根据输入的数据定义循环多少次。
  • 空间复杂度O(1)---仅有常熟级的变量,除此无额外的辅助空间

用C++实现

#include <iostream>
#include <string>
using namespace std;

//ASCII码排序
int main() {
    int n = 0;        // 一共测试n行数据
    string str = "";  // 每行由三个字符构成,中间无空格,用字符串存储 
    char tmp = 0;     // 中间变量
    cin >> n;         // 输入行数n 
    cin.get();        // 吸收掉回车  ??? 这步骤没有看的很懂?理解是将回车清楚,但是去除后,代码又报错。
    while (n-- && getline(cin, str)) {  // 输入数据,实现升序排列
        if (str[0] > str[1]) tmp = str[0], str[0] = str[1], str[1] = tmp;
        if (str[0] > str[2]) tmp = str[0], str[0] = str[2], str[2] = tmp;
        if (str[1] > str[2]) tmp = str[1], str[1] = str[2], str[2] = tmp;
        cout << "顺序为:" << str[0] << ' ' << str[1] << ' ' << str[2] << endl;
    }
    return 0;
}

image.png

C++代码复制大神的💪蓝蓝计算机考研算法-day09求5个数的最值和ASCII码排序 - 掘金 (juejin.cn)

疑问:
string str = ""; // 每行由三个字符构成,中间无空格,用字符串存储 ??? 可以用char 吗? cin.get(); // 吸收掉回车 ??? 这步骤没有看的很懂?理解是将回车清除,但是去除后,代码又报错。

小结

  1. 未给数组赋值前都没有num[0]
  2. 对于用C语言实现字符及字符串的输入输出,在VS2022上有很多未能解决的问题。
  3. 给数组赋值:
int a[5]; 
scanf("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]);
int num[5] = {};//定义一维数组大小为5并初始化 
for (int i = 0; i < 5; i++) {//循环赋值给数组
scanf_s("%d", &num[i]); }
char a, b, c, temp;    
scanf_s(" %c %c %c", &a,1,&b,1,&c,1);//输入三个字符 利用空格避免第二次输入时候显示不全
string str = "";  // 每行由三个字符构成,中间无空格,用字符串存储 
cin.get();        // 吸收掉回车
getline(cin, str); // 输入数据