资讯动态

【算法题】string算法题练习

发布时间:2026/10/10 19:19:21 来源:尧图企业网站定制
1.把字符串转换成整数LCR 192. 把字符串转换成整数 (atoi)https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/请你来实现一个myAtoi(string s)函数使其能将字符串转换成一个 32 位有符号整数类似 C/C 中的atoi函数。函数myAtoi(string s)的算法如下读入字符串并丢弃无用的前导空格检查下一个字符假设还未到字符末尾为正还是负号读取该字符如果有。 确定最终结果是负数还是正数。 如果两者都不存在则假定结果为正。读入下一个字符直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数即123 - 123 0032 - 32。如果没有读入数字则整数为0。必要时更改符号从步骤 2 开始。如果整数数超过 32 位有符号整数范围[−231, 231 − 1]需要截断这个整数使其保持在这个范围内。具体来说小于−231的整数应该被固定为−231大于231 − 1的整数应该被固定为231 − 1。返回整数作为最终结果。注意本题中的空白字符只包括空格字符 。除前导空格或数字后的其余字符串外请勿忽略 任何其他字符using namespace std; class Solution { public: int myAtoi(string str) { int i 0; int a 0, b 1; if (str.size() 0) return 0; while (i str.size() str[i] ) { i; } if (i str.size()) return 0; if(!isdigit(str[i])str[i]!-str[i]!) return 0; i; if(!isdigit(str[i])!str[i]NULL) { return 0; } i--; if(str[i]-||str[i]) { bstr[i]-?-1:1; i; } int count 0; for (int j i;j str.size();j) { if (str[j] 0 str[j] 9) { count; } } count - 1; while (str[i] 0 str[i] 9) { int digit str[i] - 0; a a * 10 digit; if (a INT_MAX / 10 || (a INT_MAX / 10 digit 7)) { if (b 1) { return INT_MAX; } else { return INT_MIN; } } i; } return a * b; } };写后感1.本题尤其要注意计算整形数值时会容易出现栈区数据溢出的问题此时需要检查。// 正数溢出 if (result INT_MAX / 10 || (result INT_MAX / 10 digit INT_MAX % 10)) { return sign 1 ? INT_MAX : INT_MIN; } // 没有溢出正常计算 result result * 10 digit;2.次方计算时pow(10, n)是浮点数转换整型时会出现丢失精度。3.普及is系列函数函数作用真返回 true假返回 falseisalpha(c)判断是不是字母a-z, A-Z数字、符号、空格isdigit(c)判断是不是数字0-9字母、符号、空格isalnum(c)判断是不是字母 数字0-9, a-z, A-Z空格、符号isspace(c)判断是不是空白符空格 , 换行制表符字母、数字、符号islower(c)判断是不是小写字母a-z大写、数字、符号isupper(c)判断是不是大写字母A-Z小写、数字、符号2.字符串相加415. 字符串相加https://leetcode.cn/problems/add-strings/给定两个字符串形式的非负整数num1和num2计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库比如BigInteger 也不能直接将输入的字符串转换为整数形式class Solution { public: string addStrings(string num1, string num2) { int end1num1.size()-1; int end2num2.size()-1; string s; s.reserve(max(num1.size(),num2.size())1); int sum0; int carry0; while(end20||end10) { sum0; int x1end10?num1[end1]-0:0; int x2end20?num2[end2]-0:0; sumx1x2carry; carrysum/10; end1--; end2--; sumsum%10; s(sum 0); } if(carry1) { s(1 0); } reverse(s.begin(),s.end()); return s; } };3.字符串相乘43. 字符串相乘https://leetcode.cn/problems/multiply-strings/给定两个以字符串形式表示的非负整数num1和num2返回num1和num2的乘积它们的乘积也表示为字符串形式。注意不能使用任何内置的 BigInteger 库或直接将输入转换为整数class Solution { public: string multiply(string num1, string num2) { int m num1.size(), n num2.size(); // 结果最多为 m n 位数 vectorint res(m n, 0); // 从个位数开始逐位相乘 for (int i m - 1; i 0; i--) for (int j n - 1; j 0; j--) { int mul (num1[i] - 0) * (num2[j] - 0); // 乘积在 res 对应的索引位置 int p1 i j, p2 i j 1; // 叠加到 res 上 int sum mul res[p2]; res[p2] sum % 10; res[p1] sum / 10; } // 结果前缀可能存的 0未使用的位 int i 0; while (i res.size() res[i] 0) i; // 将计算结果转化成字符串 string str; for (; i res.size(); i) str.push_back(0 res[i]); return str.size() 0 ? 0 : str; } };写后感1.掌握拆分乘法的逻辑方法。2.对于进位的处理要搞明白索引的位置问题。3.c_str比较问题关于代码输出正确的结果是( )vs2013 环境下编译运行int main(int argc, char *argv[]) { string ahello world; string ba; if (a.c_str()b.c_str()) { couttrueendl; } else coutfalseendl; string cb; c; if (a.c_str()b.c_str()) { couttrueendl; } else coutfalseendl; a; if (a.c_str()b.c_str()) { couttrueendl; } else coutfalseendl; return 0; }答案false false false分析:a 和 b的值虽然相同但是a.c_str()b.c_str()比较的是存储字符串位置的地址a和b是两个不同的对象内部数据存储的位置也不相同因此不相等后面c,a与b对象都没有任何的影响所以都不相等4.strcpy与memcpystrcpy是按字符串拷贝仅拷贝到\0终止符为止若原字符数组_str没有正确的\0终止符strcpy会越界拷贝内存中的随机值导致乱码memcpy是按字节数拷贝代码中指定拷贝_size 1个字节_size为有效字符数1通常为了包含\0能精准控制拷贝范围避免越界和随机值问题。5. 整形提升关键问题原因类型不匹配导致的整型提升 / 隐式转换end是int类型有符号pos是size_t类型无符号如unsigned int当end-1时比较end pos会先将int类型的end隐式转换为size_t无符号-1 转换为无符号数后是极大的正数如 32 位下为4294967295远大于pos0因此条件成立循环继续执行。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑