您提供的代码实现了一个功能:从输入字符串中找出第一个不重复的字符。下面是对这段代码的逐行解释以及一些改进建议:
代码解析
头文件和命名空间:
#include <algorithm> #include <iostream> #include <iterator> using namespace std;
- 引入必要的头文件,包括用于排序和处理迭代器的
<algorithm>
,用于输入输出的<iostream>
和用于操作迭代器的<iterator>
。 - 使用
std
命名空间以便简化代码。
- 引入必要的头文件,包括用于排序和处理迭代器的
主函数:
int main() { string str; cin >> str; // 读取用户输入的字符串 string str1 = str; // 复制原始字符串 // 排序 std::sort(str1.begin(), str1.end()); cout << str1 << endl; // 输出排序后的字符串 auto itr = std::unique(str1.begin(), str1.end()); int pos = std::distance(str1.begin(), itr); // 计算唯一字符的位置 str1 = str1.substr(pos - 1); // 从最后一个唯一字符开始截取子串 cout << str1 << endl; // 输出截取后的字符串 for (int i = 0; i < str.length(); i++) { if (str1.find(str[i]) != string::npos) { continue; // 如果在唯一字符中找到,继续循环 } else { cout << str[i]; // 找到第一个不重复字符并输出 return 0; } } cout << -1; // 如果没有找到,则输出-1 return 0; }
程序逻辑分析
- 输入一个字符串并对其进行排序。
- 利用
std::unique
函数去除相邻重复字符,并返回新的结束位置,通过std::distance
获取有效长度。 - 使用
substr
获取最后一部分(可能存在问题,这里将导致只保留最后一位)。 - 遍历原始字符串,查找不在唯一字符中的第一个字符并输出。
改进建议
您的代码可以更高效地实现目标。以下是优化后的版本,可以直接找到并打印第一个不重复的字符,而无需额外排序或处理:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
string str;
cin >> str;
unordered_map<char, int> charCount;
// 第一步:统计每个字符出现次数
for (char ch : str) {
charCount[ch]++;
}
// 第二步:寻找第一个不重复的字符
for (char ch : str) {
if (charCount[ch] == 1) {
cout << ch;
return 0;
}
}
cout << -1; // 若没有不重复的字符则输出 -1
return 0;
}
优化说明
- 使用了
unordered_map
来存储每个字符出现的次数,这样可以在 O(n) 时间复杂度内完成统计。 - 然后再遍历一次原始字符串来找到第一个出现次数为一的不重复字符。这种方法避免了多余的排序和处理步骤,提高了效率。
这种实现方式更加清晰且性能更优,更适合寻找第一次出现的不重复字符。如果有其他需求或进一步的问题,请随时告诉我!
内容由零声教学AI助手提供,问题来源于学员提问