力扣——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;
    }
};
相关推荐
工业甲酰苯胺18 分钟前
C语言之输入输出
c语言·c++·算法
C++忠实粉丝39 分钟前
计算机网络之NAT、代理服务、内网穿透、内网打洞
网络·c++·网络协议·计算机网络·http·智能路由器
努力d小白1 小时前
leetcode98.验证二叉搜索树
算法
YueTann1 小时前
Leetcode SQL 刷题与答案-基础篇
sql·算法·leetcode
归寻太乙1 小时前
算法基础Day7(动态规划)
算法·动态规划
片片叶1 小时前
C++(十四)
开发语言·c++
hn小菜鸡2 小时前
LeetCode 2320.统计放置房子的方式数
算法·leetcode·职场和发展
高一学习c++会秃头吗2 小时前
leetcode_547 省份数量
算法·leetcode·职场和发展
天赐细莲2 小时前
(仓颉) Cangjie 刷力扣基础语法小结
数据结构·算法·leetcode·职场和发展
程序猿阿伟2 小时前
《C++巧铸随机森林:开启智能决策新境界》
开发语言·c++·随机森林