c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)

简介: c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)

1.把字符串转换成整数


题目详情

代码

class Solution {
public:
    int StrToInt(string str) {
        int flag=1;
        long long ret=0;
        string::iterator it=str.begin();
       // 处理空字符串的情况
        if (it == str.end()) 
        {
            return 0;
        }
        // 处理符号
        if (*it == '-') 
        {
            flag = -1;
            ++it;
        } else if (*it == '+') 
        {
            ++it;
        }
        // 遍历字符串,将每个字符转换为数字并累加到结果中
        while (it != str.end()) {
            if (*it >= '0' && *it <= '9') 
            {
                ret = ret * 10 + (*it - '0');
                ++it;
            } else 
            {
                return 0;
            }
        } 
        // 根据符号返回最终结果
        return flag * ret;
    }
};  


思路

首先处理空字符串为空的情况()


再处理第一个字符可能为+ -的情况,直接定一个flag初始化为1,遇到-就赋值为-1


接下来就利用迭代器进行循环,如果是字符数字就直接使用

ret = ret * 10 + (*it - '0');

是其他字符,直接return 0;了


2. 344.反转字符串


题目详情

代码1

class Solution {
public:
    void reverseString(vector<char>& s) {
        reverse(s.begin(),s.end());
        }
    }
};

思路1

大家学习了c++,可能直接就想到了。但是我们刷题还是尽量会本质

代码2

class Solution {
public:
    void reverseString(vector<char>& s) {
        //reverse(s.begin(),s.end());
        int left=0;
        int right=s.size()-1;
        while(left<right)
        {
            swap(s[left],s[right]);
            left++;
            right--;
        }
    }
};


思路

还是老朋友啦:使用双指针法,进行交换,直到相遇


3. 387. 字符串中的第一个唯一字符


题目详情

代码

class Solution {
public:
    int firstUniqChar(string s) {
        int arr[26]={0};
        int index=0;
        char singal='0';
        //不会出现空字符
        for(auto e:s)
        {
            arr[e-'a']++;
        }
        //再次遍历string,而不是arr
        for(int i=0;i<s.size();i++)
        {
            if(arr[s[i]-'a']==1)
            {
                return i;
            }
        }
        return -1;
    }
};


思路

利用计数排序的思想,利用一个数组


我们看到,这个字符串只会出现小写字母,我们就定义一个整型数组 arr[26]:0处是a,1处是b…,25处是z

先把string给遍历一遍,这里是使用了范围for:哪个字母出现一此,就使用 arr[e-'a']++;来进行自增,现在出现一次的字母对应在数组里的值是1,两次是2

有时有多个出现一次的字母,我们需要返回的是第一个

所以还是从string开始遍历,为了返回第一个(我一开始因为从arr开始遍历,一直不能通过)


4. 917. 仅仅反转字母


题目详情

代码

class Solution {
public:
bool isLetter(char ar)
{
    if((ar>='A'&&ar<='Z')||(ar>='a'&&ar<='z'))
    {
        return true;
    }
    return false;
}
    string reverseOnlyLetters(string s) {
        //仿照快排一次的思想
        int left=0;
        int right=s.size()-1;
        while(left<right)
        {
            //右侧先行
            while(left<right&&!isLetter(s[right]))//找字母才停
            {
                right--;
            }
            while(left<right&&!isLetter(s[left]))//找字母
            {
                left++;
            }
            swap(s[left],s[right]);
            right--;
            left++;
        }
        return s;
    }
};

思路

使用双指针的方法,类似于快速排序中的一次划分。


具体来说,维护了两个指针(下标) left 和 right,它们分别指向字符串的开头和结尾。

然后,你使用 while 循环来不断移动这两个指针,并在遇到字母时进行交换。当 left 指向的字符不是字母时,left 指针向右移动;当 right 指向的字符不是字母时,right 指针向左移动。

一旦找到了两个位置上的字母,就交换它们的位置。最终,当 left 和 right 指针相遇时,整个字符串就完成了反转

今天就到这里啦!

目录
相关文章
|
8天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
10天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
16天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`&#39;1.2,2,3,4,5&#39;`)转换为对象数组。通过使用`split(&#39;,&#39;)`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
20天前
|
XML 编解码 数据格式
Python标准数据类型-String(字符串)
Python标准数据类型-String(字符串)
23 2
|
20天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
48 1
|
5天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0
|
30天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
38 0
|
5天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
19 0
|
4天前
|
设计模式 Java C++
【C++高阶(八)】单例模式&特殊类的设计
【C++高阶(八)】单例模式&特殊类的设计