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

文章目录

  • 1.把字符串转换成整数
    • 题目详情
    • 代码
    • 思路
  • 2. 344.反转字符串
    • 题目详情
    • 代码1
    • 思路1
    • 代码2
    • 思路
  • 3. 387. 字符串中的第一个唯一字符
    • 题目详情
    • 代码
    • 思路
  • 4. 917. 仅仅反转字母
    • 题目详情
    • 代码
    • 思路

1.把字符串转换成整数

传送门

题目详情

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;
    }
};  

思路

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

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

  3. 接下来就利用迭代器进行循环,如果是字符数字就直接使用
    ret = ret * 10 + (*it - '0');
    是其他字符,直接return 0;了

2. 344.反转字符串

传送门

题目详情

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

代码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. 字符串中的第一个唯一字符

传送门

题目详情

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

代码

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;
    }
};

思路

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

  1. 我们看到,这个字符串只会出现小写字母,我们就定义一个整型数组 arr[26]:0处是a,1处是b…,25处是z
  2. 先把string给遍历一遍,这里是使用了范围for:哪个字母出现一此,就使用 arr[e-'a']++;来进行自增,现在出现一次的字母对应在数组里的值是1,两次是2
  3. 有时有多个出现一次的字母,我们需要返回的是第一个
    所以还是从string开始遍历,为了返回第一个(我一开始因为从arr开始遍历,一直不能通过)

4. 917. 仅仅反转字母

传送门

题目详情

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

代码

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;
    }
};

思路

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

  1. 具体来说,维护了两个指针(下标) left 和 right,它们分别指向字符串的开头和结尾。
  2. 然后,你使用 while 循环来不断移动这两个指针,并在遇到字母时进行交换。当 left 指向的字符不是字母时,left 指针向右移动;当 right 指向的字符不是字母时,right 指针向左移动。
  3. 一旦找到了两个位置上的字母,就交换它们的位置。最终,当 left 和 right 指针相遇时,整个字符串就完成了反转

今天就到这里啦!

你可能感兴趣的:(c语言题目分享,c++,开发语言,学习,linux,java,c语言)