1.返回字符串中第一个唯一的字符
1.1题目描述
给定一个字符串s ,找到它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
示例:
1.2思路
这里提供两种思路:第一种是利用哈希表,先遍历一遍字符串存到数组中++(a"下标为0,后面字母一次加1),遍历完后,对字符串进行遍历,再那去与数组该位置比较,是否为1,为返回该位置。(注意:第二遍遍历时,不能遍历数组,要不然可能出现,第一次唯一出现的字符为'z'但后面又出现'a'也是唯一出现,但不是第一个,但这时候就会返回a的位置)。
第二种是先遍历利用正序,反序寻找,利用find函数(这个函数是返回传入要找的字符第一次出现的下标,默认从0下标,开始从前向后找 )rfind函数(这个函数是返回传入要找的字符第一次出现的下标,默认开始从后向前找),找到是否为同一个位置,如果是,那说明这个字符只出现了一次,就直接返回,如果遍历完没找到就直接返回-1。
1.3代码
方法一:
cpp
class Solution {
public:
int firstUniqChar(string s) {
int i=0;
int count[26]={0};
while(i<s.size())
{
count[s[i]-'a']++;
++i;
}
for(int j=0;j<s.size();j++)
{
if(count[s[j]-'a']==1)
return j;
}
return -1;
}
};
方法二:
cpp
class Solution {
public:
int firstUniqChar(string s)
{
for(int i=0; i<s.size(); ++i)
{
int index = s.find(s[i]);
int reverse_index = s.rfind(s[i]);
if(index == reverse_index)
return i;
}
return -1;
}
};
2把字符串转换成整数
2.1题目描述
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi
函数)。
函数 myAtoi(string s)
的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0
。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231
的整数应该被固定为 −2^31
,大于 2^31 − 1
的整数应该被固定为 2^31 − 1
。
返回整数作为最终结果。
2.2思路
根据题目要求要排除字符串前面的空格,其次就是判断第一个符号位是否为负,所以这里定义一个下标,遇到就++,然后从这个位置,开始读,如果不是0~9字符就直接跳出循环,**其次还要注意:是否已经超出整型范围,所以可以定义这个数的时候用long long,再去和INT_MAX,INT_MIN比较,如果超出范围,就直接输出这个边界值,**没有超出范围,就返回这个值。
2.3代码
cpp
class Solution {
public:
int myAtoi(string str) {
int i=0;
while(str[i]==' ')
{
i++;
}
int flag=1;
if(str[i]=='-')
{
flag=-1;
}
if(str[i]=='-'||str[i]=='+')
i++;
long long sum=0;
for(;i<str.size();i++)
{
if(str[i]>='0'&&str[i]<='9')
{
sum=sum*10+(str[i]-'0');
if(sum>INT_MAX)
return flag==1?INT_MAX:INT_MIN;
}
else
break;
}
int ret=sum*flag;
return ret;
}
};