返回 课程

信奥AC之路-3级

0% 完成
0/0 步骤
  1. 第一课:数组基础
    4 主题|小节
  2. 第二课:数组基础二
    6 主题|小节
  3. 第三课:数组基础三
    6 主题|小节
  4. 第四课:数组基础四
    7 主题|小节
  5. 第五课:数组基础五
    5 主题|小节
  6. 第六课:数组用于统计,去重,排序
    5 主题|小节
  7. 第七课:冒泡排序
    6 主题|小节
  8. 第八课:数组连续性元素
    6 主题|小节
  9. 第九课:数组综合一
    7 主题|小节
  10. 第十课:字符数组
    7 主题|小节
  11. 第十一课:字符数组基础应用
    5 主题|小节
  12. 第十二课:字符数组基础应用二
    6 主题|小节
  13. 第十三课:字符数组进阶
    6 主题|小节
  14. 第十四课:字符串进阶二
    6 主题|小节
  15. 第十五课:字符串(STL)
    9 主题|小节
  16. 第十六课:字符串基础
    6 主题|小节
  17. 第十七课:字符串函数
    6 主题|小节
  18. 第十八课:字符串函数二
    4 主题|小节
  19. 第十九课:sort函数
    7 主题|小节
  20. 第二十课:字符串进阶
    7 主题|小节
  21. 第二十一课:字符串进阶二
    6 主题|小节
  22. 第二十二课:进制转换--十进制转其他进制
    5 主题|小节
  23. 第二十三课:进制转换--其他进制转十进制
    5 主题|小节
  24. 第二十四课:二进制,八进制,十六进制转换
    5 主题|小节
  25. 第二十五课:数据编码基础
    6 主题|小节
  26. 第二十六课:位运算基础
    6 主题|小节
课 12, 主题|小节 3
进行中

12.3 字典序比较

2025年9月22日
课 进展
0% 完成

“在计算机科学中,我们经常需要比较字符串的大小,”我说道,”字典序就像查字典一样,按字母顺序比较字符串的大小关系。”

12.3.1 寻找字典序最小的字符串

题目描述: 编写程序,针对输入的N个不同的字符串(长度不超过30),输出其中字典码最小的字符串。

输入格式: 输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式: 输出字典码最小的字符串。

样例输入

5
Li
Wang
Zha
Jin
Xian

样例输出

Jin

代码实现(方法一:手动比较)

#include<bits/stdc++.h>
using namespace std;

int main(){
    char a[35], mi[35];    // a存储当前字符串,mi存储最小字符串
    int n;
    cin >> n;
    cin >> mi;             // 读入第一个字符串作为初始最小值
    n--;                   // 还需要读入n-1个字符串
    
    while(n--){
        cin >> a;          // 读入下一个字符串
        bool f = false;    // 标记是否需要更新最小字符串
        
        // 逐字符比较两个字符串
        for(int i = 0; i < min(strlen(a), strlen(mi)); i++){
            if(a[i] != mi[i]){          // 找到第一个不同的字符
                if(a[i] < mi[i]){       // 如果a的字符更小
                    f = true;           // 需要更新最小字符串
                }
                break;                  // 跳出比较循环
            }
            // 如果比较到了较短字符串的末尾
            if(i == min(strlen(a), strlen(mi)) - 1){
                if(strlen(a) < strlen(mi)){  // 较短的字符串字典序更小
                    f = true;
                }
            }
        }
        
        // 如果需要更新,复制新的最小字符串
        if(f == true){
            for(int i = 0; i < strlen(a); i++){
                mi[i] = a[i];
            }
            mi[strlen(a)] = '';       // 添加字符串结束符
        }
    }
    
    cout << mi;            // 输出字典序最小的字符串
    return 0;
}

代码实现(方法二:使用strcmp函数)

#include<bits/stdc++.h>
using namespace std;

int main(){
    char a[35], mi[35];    // a存储当前字符串,mi存储最小字符串
    int n;
    cin >> n;
    cin >> mi;             // 读入第一个字符串作为初始最小值
    n--;                   // 还需要读入n-1个字符串
    
    while(n--){
        cin >> a;          // 读入下一个字符串
        int k = strcmp(a, mi);    // 比较两个字符串
        if(k < 0){         // 如果a字典序更小
            strcpy(mi, a); // 复制a到mi
        }
    }
    
    cout << mi;            // 输出字典序最小的字符串
    return 0;
}

算法解析

方法一手动实现字典序比较:逐字符比较,遇到不同字符时判断大小;如果前缀相同,较短的字符串字典序更小。

方法二使用C++标准库函数strcmp():返回值小于0表示第一个字符串字典序更小。