【小菜鸡刷题记】:字符串
- 剑指 Offer 05. 替换空格
- 剑指 Offer 58 - II.左旋转字符串
- 剑指 Offer 20.表示数值的字符串
- 剑指 Offer 67. 把字符串转换成整数
特此声明:题目均来自于力扣
剑指 Offer 05. 替换空格
题目链接
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
class Solution {
public:
string replaceSpace(string s) {
string str;
for(int i=0;i<s.size();++i)
{
if(s[i]==' ')
{
str+="%20";
}
else
{
str+=s[i];
}
}
return str;
}
};
剑指 Offer 58 - II.左旋转字符串
剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
//三步翻转法
class Solution {
public:
string reverseLeftWords(string s, int n) {
int k=n%s.size();
//反转前半段
reverse(s.begin(),s.begin()+k);
//反转后半段
reverse(s.begin()+k,s.end());
//整体反转
reverse(s.begin(),s.end());
return s;
}
};
//字符串拼接法
class Solution {
public:
string reverseLeftWords(string s, int n) {
return s.substr(n)+s.substr(0,n);
}
};
剑指 Offer 20.表示数值的字符串
剑指 Offer 20. 表示数值的字符串
解题思路:数值可以表示为A [ . [ B ] ] [ E | e C ]或者.B [ e | E C ]
其中A是这个数值的整数部分,B是小数点后及e之前的小数部分,C是e的指数部分;
整数部分不是必须的
以数值字符串123.45e+6为例:123为整数部分A,45为小数部分B,+6为指数部分C
class Solution {
public:
//匹配正负号
bool isInteger(string& s)
{
if(s[0]=='+'||s[0]=='-')
s.erase(0,1);
return Isdigit(s);
}
//判断是否出现数字
bool Isdigit(string& s)
{
int i=0;
while(s[i]!='\0'&&isdigit(s[i]))
{
i++;
}
s=s.substr(i);
return i>0;
}
void EraseSpace(string& s)
{
//去除首尾空格
int i = 0;
while (i < s.size() && s[i] == ' ')
i++;
s = s.substr(i);
while (s.back() == ' ')
s.pop_back();
}
bool isNumber(string s) {
if(s=="") return false;
EraseSpace(s);
//判断是否出现‘+’‘-’数字,并原地修改字符串
bool Integer=isInteger(s);
//如果出现.,证明到了小数部分
if(s[0]=='.')
{
s.erase(0,1);
// ||的原因
// 1:9. 等于9.0
// 2:9.9 正常数值
// 3:.9 等于0.9
Integer=Isdigit(s)||Integer;
}
//如果出现‘e’"E",指数部分
if(s[0]=='e'||s[0]=='E')
{
s.erase(0,1);
//用&&的原因
// 1.e前面没有整数:.e6、e6不能表示数字
// 2.e的后面没有整数: 6e、6e3不能表示数字
Integer=Integer&&isInteger(s);
}
//特殊情况:如果e后面有小数点,会在s=="\0"这一步判断失败
return Integer && s=="\0";
}
};
剑指 Offer 67. 把字符串转换成整数
剑指 Offer 67. 把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
考虑特殊输入,如字符串是一个""、"\0" "0" "+0" "-0"
我定义了一个枚举类型以及一个全局变量用来分辨是否是合法输入
enum{IsUnlawful=0,IsLawful};//判断是否是非法输入
static int g_state=Islawful;
class Solution {
public:
int strToInt(string str) {
int g_state=IsUnlawful;//非法输入
long long num=0;
int i=0;
if(str !="" && str!="\0")
{
bool flag=true;//正数
while(str[i]==' ')//去空格
{
++i;
}
if(str[i]=='+')//判断符号
{
i++;
}
else if(str[i]=='-')
{
i++;
flag=false;
}
if(str[i]!='\0')//+-'\0';
{
num=DigitToStr(str,i,flag);//转换
}
}
//cout<<g_state<<endl;这里进用来测试是非法输入还是合法输入
return static_cast<int>(num);
}
long long DigitToStr(string& s,int& i,bool flag)
{
long long num=0;
while(s[i]!='\0')
{
if(isdigit(s[i]))
{
int ret=flag==true? 1:-1;
num=10*num+(s[i]-'0')*ret;
//判断是否越界
if(num>INT_MAX&&flag)
{
return INT_MAX;
}
if(num<INT_MIN&&!flag)
{
return INT_MIN;
}
}
if(!isdigit(s[i]))//异常结束;我这里把 "4193 with words"、"words and 987"看成一种情况
{
break;
}
++i;
if(s[i]=='\0')//正常结束
{
//设置为合法输入
g_state=IsLawful;
}
}
return num;
}
};