这是关于一个普通双非本科大一学生的C++的学习记录贴
在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料
那么开启正题
今天学了一些基础的string的函数,刷了一些题,等string学完了再总结语法,函数
1.把字符串转换成整数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
这题比较简单,注意字符-'0'转换成整形还有题给的特殊条件判断即可
cpp
class Solution {
public:
int StrToInt(string str)
{
int flag = 1;
int i = 0;
int sum = 0;
if(str[0] == '-')
{
flag = -1;
}
for(i=0;i<str.size();i++)
{
if((str[i] == '+' || str[i] == '-') && i == 0)
{
i++;
}
if(str[i] >= '0' && str[i] <= '9')
{
sum = sum * 10 + (str[i] - '0');
}
else
{
return 0;
}
}
return flag * sum;
}
};
这是ac代码
2.仅仅反转字母
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s
这个题目和快速排序的单趟排序很像,左边找到一个字母,右边找到一个字母,交换即可
cpp
class Solution {
public:
bool letter(char ch)
{
if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
return true;
else
return false;
}
string reverseOnlyLetters(string s)
{
int left = 0;
int right = s.size() - 1;
while(left < right)
{
while(!letter(s[left]) && left < right)
{
++left;
}
while(!letter(s[right]) && left < right)
{
--right;
}
swap(s[left],s[right]);
left++;
right--;
}
return s;
}
};
这是ac代码
3.字符串中的第一个唯一字符
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
这题用到了计数的思想,创建一个数组,遍历字符串,在映射的数组内存内++,再遍历数组就可以找到我们要求的结果,这样时间复杂度为O(N)
cpp
class Solution {
public:
int firstUniqChar(string s)
{
int a[26] = {0};
int i=0;
for(i=0;i<s.size();i++)
{
a[s[i]-'a']++;
}
for(i=0;i<s.size();i++)
{
if(a[s[i] - 'a'] == 1)
{
return i;
}
}
return -1;
}
};
这是ac代码
4.字符串最后一个单词的长度
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
首先我们要知道,cin读取时,遇到空格或者回车结束,而题目明显要读取带有含空格的字符串,显然我们不能用cin,于是我们使用getline这个函数来配合string读取带空格的字符串,其次,这个题目的思路和上面差不多,也是计数思想
cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
int ret = 0;
int i = 0;
int count = 0;
for(i=0;i<s.size();i++)
{
if(s[i] == ' ')
{
count++;
}
}
for(i=0;i<s.size();i++)
{
if(count == 0)
{
ret = i;
break;
}
if(s[i] == ' ')
{
count--;
}
}
cout << (s.size() - ret) << endl;
}
}
这是ac代码
5.验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串
字母和数字都属于字母数字字符
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回false
首先我们创建一个新string,遍历原字符串,将我们想要的数据拷过去,然后进行验证
cpp
class Solution {
public:
bool isPalindrome(string s)
{
string str;
int i=0;
for(i=0;i<s.size();i++)
{
if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= '0' && s[i] <= '9'))
{
str.push_back(s[i]);
}else if((s[i] >= 'A' && s[i] <= 'Z'))
{
str.push_back(s[i] - 'A' + 'a');
}
}
int left = 0;
int right = str.size() - 1;
while(left < right)
{
if(str[left] != str[right])
{
return false;
}
left++;
right--;
}
return true;
}
};
这是ac代码
总结:string作为STL的一员使用起来很便捷,明天将会探知他的实现原理,联系更难得题目
今天的博客就到这里了,后续内容明天分享,最近因为考试周原因不能更新太多内容,等考试周结束了再"快马加鞭"
新手第一次写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!!