1. 三道经典OJ题目的深度解析与实战技巧
作为程序员,算法与数据结构能力是基本功。今天我将分享三道经典OJ题目的详细解题思路、代码实现和优化技巧,这些题目涵盖了字符串处理、回文检测和大整数运算等核心算法知识点。
1.1 OJ104:实数相等性判断
1.1.1 问题重述与难点分析
题目要求比较两个可能带有前导零和后导零的非负实数是否相等。例如:
- "00123.4500" 和 "123.45" 应该被认为是相等的
- "0123" 和 "123.000" 也相等
核心难点在于:
- 实数可能超过1000位,无法用常规数值类型存储
- 前导零和后导零的存在使得直接字符串比较无效
- 需要考虑没有小数点的情况
1.1.2 标准化处理算法
解决这个问题的关键在于实现一个标准化函数,将任意格式的实数转换为规范形式:
cpp复制string normalize(string s) {
// 查找小数点位置
size_t pos = s.find('.');
string integer, fraction;
// 分离整数和小数部分
if(pos == string::npos) {
integer = s;
fraction = "";
} else {
integer = s.substr(0, pos);
fraction = s.substr(pos + 1);
}
// 去除整数部分前导零(保留最后一个零)
size_t i = 0;
while(i < integer.length() - 1 && integer[i] == '0') {
i++;
}
integer = integer.substr(i);
// 去除小数部分后导零
while(!fraction.empty() && fraction.back() == '0') {
fraction.pop_back();
}
// 重组标准化字符串
if(fraction.empty()) {
