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 指针相遇时,整个字符串就完成了反转

今天就到这里啦!

目录
相关文章
|
1月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
65 16
|
7天前
|
Java 程序员
课时16:String字符串
课时16介绍了Java中的String字符串。在Java中,字符串使用`String`类表示,并用双引号定义。例如:`String str = &quot;Hello world!&quot;;`。字符串支持使用“+”进行连接操作,如`str += &quot;world&quot;;`。需要注意的是,当“+”用于字符串与其他数据类型时,其他类型会先转换为字符串再进行连接。此外,字符串中可以使用转义字符(如`\t`、`\n`)进行特殊字符的处理。掌握这些基本概念对Java编程至关重要。
|
4月前
|
索引 Python
String(字符串)
String(字符串)。
69 3
|
5月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
72 4
|
5月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
63 5
|
5月前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
67 3
|
5月前
|
缓存 网络协议 API
C/C++ StringToAddress(字符串转 boost::asio::ip::address)
通过上述步骤和示例代码,你可以轻松地在C++项目中实现从字符串到 `boost::asio::ip::address`的转换,从而充分利用Boost.Asio库进行网络编程。
176 0
|
5月前
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
22天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
30 6