力扣——1.返回字符串中第一个唯一的字符;2.把字符串转换成整数(C++)

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;
    }
};
相关推荐
无名猿几秒前
std::optional 完全指南:别再用 -1 和 nullptr 表达「没有值」
c++·标准库·现代c++·语法基础
就叫年华吧丶8 分钟前
长文档点目录定位总是不准?一个 content-visibility + 平滑滚动引发的连环坑(Vue3 实战)
前端·javascript·算法·vue
FPGA信号处理15 分钟前
【信号检测与估计】第四节课:非高斯噪声下的 BLUE、极大似然与 EM 算法
人工智能·算法·机器学习
无名猿25 分钟前
nullptr 取代 NULL 和 0:空指针的三种写法和唯一正确解
c++·现代c++·语法基础·踩坑记录
大侠归来29 分钟前
C++ 与 Lua 的协程交互:从原理到实战
c++·lua·交互
无名猿38 分钟前
size_t 与 int 混用陷阱:有符号无符号比较与整数提升
c++·标准库·语法基础·踩坑记录
.道阻且长.41 分钟前
C++ 11:可变参数模板
前端·c++·算法
m0_380743871 小时前
Qt实现调用相机进行拍照并进行图像处理
开发语言·c++
励志不掉头发的内向程序员3 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
Doubbbbbbble云3 小时前
基于贪心算法的区间覆盖问题求解策略4
算法·贪心算法