综合门户网站建设方案,python搭建网站,泸州工投建设集团网站,找设计公司去哪个平台【C/C】涉及string类的经典OJ编程题 一. 把字符串转化成整数#xff08;atoi#xff09;解法一#xff1a;#xff08;不用long#xff09;完整代码#xff1a;解法二#xff1a;#xff08;用long#xff09; 二.字符串相加代码实现#xff08;含注释#xff09;】涉及string类的经典OJ编程题 一. 把字符串转化成整数atoi解法一不用long完整代码解法二用long 二.字符串相加代码实现含注释 三.反转字符串代码实现 四.字符串中的第一个唯一字符解法一解法二推荐 一. 把字符串转化成整数atoi
点这里本题LeetCode链接 该题源代码声明 作者Krahets 链接https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/solutions/201301/mian-shi-ti-67-ba-zi-fu-chuan-zhuan-huan-cheng-z-4/ 来源力扣LeetCode
解法一不用long
首先来看该题要用到的所以的变量的定义和初始化 int res 0, bndry INT_MAX / 10;int i 0, sign 1, length str.size();第一步
判断字符串是否为空字符串读取字符串并丢弃无用的前导空歌并且判断该字符串是否为全为空格的字符串。通过对下标 i 的控制来实现。 代码实现 if(length 0) return 0;while(str[i] )if(i length) return 0;//若不是空字符串i走到符号位第二步 判断字符的正负 代码实现
if(str[i] -) sign -1;
if(str[i] - || str[i] ) i;//让i走到符号位后的第一个数字字符第三步关键 最大最小数值边界的处理 一旦遇到非数字字符直接返回0此时的 j 为第一个数字字符。 变量的定义和初始化int res 0, bndry INT_MAX / 10; INT_MAX 等于2147483647注意这里的个位数字7注意初始化的bndry 214748364 再看这句代码res res * 10 (str[j] - ‘0’);通过这句代码可以将字符数字转发为对应大小的整形数值。现在就可以理解 if 语句里面的条件判断
当res一旦大于bndry 214748364往下走完语句res res * 10 (str[j] - ‘0’);时res就会越界当res bndry str[j] ‘7’此时下标 j 指向的字符大于7时往下走完语句res res * 10 (str[j] - ‘0’);时res也会越界
代码实现 for(int j i; j length; j) {if(str[j] 0 || str[j] 9) break;if(res bndry || res bndry str[j] 7)return sign 1 ? INT_MAX : INT_MIN;res res * 10 (str[j] - 0);}完整代码
class Solution {
public:int myAtoi(string str) {int res 0, bndry INT_MAX / 10;int i 0, sign 1, length str.size();if(length 0) return 0;while(str[i] )if(i length) return 0;if(str[i] -) sign -1;if(str[i] - || str[i] ) i;for(int j i; j length; j) {if(str[j] 0 || str[j] 9) break;if(res bndry || res bndry str[j] 7)return sign 1 ? INT_MAX : INT_MIN;res res * 10 (str[j] - 0);}return sign * res;}
};解法二用long
用long的前提操作系统环境能存储 64 位大小的有符号整数
class Solution {
public:int myAtoi(string str) {long int res 0, bndry INT_MAX / 10;int i 0, sign 1, length str.size();if(length 0) return 0;while(str[i] ){i;if(i length)return 0;}if(str[i] -)sign -1;if(str[i] - || str[i] ) i;for(int j i; j length; j){if(str[j] 9 || str[j] 0)return sign * res;res res * 10 str[j] - 0;//如果不用long这句代码可能会造成res溢出int max无法通过部分测试if(res INT_MAX)return sign 1 ? INT_MAX : INT_MIN;}return sign * res;}
};二.字符串相加
点这里本题LeetCode链接
代码实现含注释
class Solution {
public:string addStrings(string num1, string num2) {string tmp;int count 0;//用于进位int gap1 num1.end() - num1.begin() - 1;//字符串1尾下标int gap2 num2.end() - num2.begin() - 1;//字符串2尾下标while(gap1 0 || gap2 0){int x gap1 0 ? num1[gap1] - 0 : 0;//将数字字符串转换为对应整形数字int y gap2 0 ? num2[gap2] - 0 : 0;//当下标走到负数将其转换为0int sum x y count;//对应两两相加在加上进位数值count sum / 10;//得进位数值sum % 10;//得个位数值tmp (sum 0);//依次拼接逆序gap1--;gap2--;}if(count 1)//解决一个字符串为“0”另一个为“9”还有最高位未进位的情况{tmp 1;}reverse(tmp.begin(), tmp.end());//颠倒为顺序return tmp;}
};三.反转字符串
点这里本题LeetCode链接
代码实现
class Solution {
public:void reverseString(vectorchar s) {int begin 0;int end s.size() - 1;while(begin end){swap(s[begin], s[end]);begin;end--;}}
};四.字符串中的第一个唯一字符
点这里本题LeetCode链接
解法一
原理两两比较字符串中的所以字符通过计数来判断是否有相同字符
class Solution {
public:int firstUniqChar(string s) {for(int i 0; i s.size(); i){int count 0;int j 0;for(; j s.size(); j){if(s[i] s[j] i ! j)break;if(s[i] ! s[j])count;}if(count s.size() - 1)return i;}return -1;}
};解法二推荐
原理如果从左往右找和从右往左找同一个字符返回它们的下标相同则在给出的字符串中该字符有且只有这一个 s.find(s[i]) : 返回字符串s中从左向右查找s[i]第一次出现的位置 s.rfind(s[i]) : 返回字符串s中从右向左查找s[i]第一次出现的位置 解法二声明 作者WTY2002 链接https://leetcode.cn/problems/first-unique-character-in-a-string/solutions/948758/qiao-yong-stringrong-qi-de-cha-zhao-han-y1507/ 来源力扣LeetCode class Solution {
public:int firstUniqChar(string s) {for(int i 0; i s.size() ; i){if(s.find(s[i]) s.rfind(s[i])){return i;}}return -1;}
};