1.LCR 192. 把字符串转换成整数 (atoi)

这题难度不大,我这里采取遍历跳过空格的方式,我先展示出我的代码,然后慢慢讲解:
cpp
class Solution {
public:
int myAtoi(string str)
{
if (str.empty())
return 0;
int length=str.size();
int i=0;
int symbol=1;
int sum=0;
while(i<length && str[i]==' ')
{
++i;
}
if(i<length && str[i]=='+'||str[i]=='-')
{
if(str[i]=='-')
symbol=-1;
++i;
}
while(i<length && isdigit(str[i]))
{
int a=str[i]-'0';
if(sum>(INT_MAX-a)/10)
{
if(symbol==1)
return INT_MAX;
else
return INT_MIN;
}
sum=sum*10+a;
++i;
}
return sum*symbol;
}
};
首先我们先排除特殊情况,判断这个string是否为空

下面我们对我们所需要的一些数据进行初始化

length是string的长度
i是遍历的位置
symbol是正负号,1为正号,-1为负号。
sum为最后遍历出的结果计算的和。
做这道题我们首先要理清楚思路,
有以下四种情况需要考虑:
首部空格: 忽略之即可;
符号位: 三种情况,即 ''+++'' , ''−-−'' , ''无符号" ;用一个变量保存符号位,返回前判断正负;
非数字字符: 遇到首个非数字的字符时,直接返回;
数字字符:
字符转数字: "此数字的 ASCII 码" 与 '0' 相减即可;
数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 sum ,则数字拼接公式为:
x=c-'0'
sum=sum*10+x。
用例的示意图(可能不大准确):

我们先遍历排除开头空格,然后记录符号

接下来我们要记录数字,这里我采用一个自带的函数


判断此时读入的是否为数字,是数字则读入

注意:我们要判断是否超过了int的最大值或最小值,而且要保证自己的int类型不超过int的最大值或最小值
因此,这里我把等式左边的操作移到了等式右边。

如果超出了最值,我们接下来通过symbol的值来判断是最大值还是最小值,然后返回相应结果。
如果读完了所有的数,都没有超出最值,那么我们直接调用上面我们写的公式返回

2.415. 字符串相加

这题明显比上面一道题简单,老规矩,先上代码
cpp
class Solution {
public:
string addStrings(string num1, string num2) {
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
string ans = "";
while (i >= 0 || j >= 0 || add != 0) {
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
int result = x + y + add;
ans.push_back('0' + result % 10);
add = result / 10;
i -= 1;
j -= 1;
}
reverse(ans.begin(), ans.end());
return ans;
}
};
首先我们先求出最后一位的下标(string中数的最后一位就是下标最后一位)

同时我们一块定义好我们的进位值,因为我们进行的是10进制计算。大于10要进1,因为一开始,没有进位,所以add=0

我们再创建一个新的string用来存放计算结果:
我们先把string是的数从字符类型转换成数字类型,然后计算(记得加上进位值)

然后我们把它尾插入我们创建的新的string中(这里我选择采用尾插,但也可以用头插(但是头插的时间复杂度更高,因为每次头插都要移动位置))

然后我们调整下标和进位值

最后我们调用reverse函数,翻转一下顺序



3.387. 字符串中的第一个唯一字符

这题难度也不大,我们之后可以用哈希表来解决,这里我选择采用计数数组来解决这个问题
cpp
class Solution {
public:
int firstUniqChar(string s) {
int count[26] = {0};
for(auto ch : s)
{
count[ch-'a']++;
}
for(int i = 0; i < s.size(); i++)
{
if(count[s[i]-'a'] == 1)
{
return i;
}
}
return -1;
}
};
把字符串遍历使对应数组++,然后再次遍历数组输出唯一字符.