题目一:把字符串转换成整数
题目描述:
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。输入的字符串包括数字字母符号,可以为空。
示例:
输入:”+2147483647″
输出:“2147483647”
分析:
字符串当中可能包含数字、字母和其他符号,正数可以在前面放上正号,由此可以确定的是,一个字符串一个合法的数值,则除了其第一个字符可能是正号或负号以外,其他字符都应该是数字字符。
步骤:
1、先判断除第一个字符以外的字符,若是其中出现了非数字字符的字符,则该字符串非法,否则我们计算出其转换为整数后的数值。
2、再判断第一个字符,若是正号,则当前整数的正值;若是负号,则返回当前整数的负值;若还是数字字符,则再次更新当前整数的数值并返回;若第一个字符不属于这三种情况,则说明该字符串还是非法的。
代码:
class Solution {
public:
int StrToInt(string str) {
if (str.size() == 0) //空字符串,返回0
return 0;
int start = 0; //头指针指向第一个字符
int end = str.size() - 1; //尾指针指向最后一个字符
int ret = 0; //字符串转换为整数后的结果
int i = 1; //标识十进制当前位的权重(当前为个位,权重为1)
while (start < end) //判断第一个字符之后的字符
{
if (str[end] < '0' || str[end] > '9') //若不是数字,则非法
{
return 0;
}
ret += i*(str[end] - '0'); //ret更新
i *= 10; //下一位权重增大十倍
end--; //继续判断
}
//判断第一个字符
if (str[end] >= '0' && str[end] <= '9') //是数字
return ret + i*(str[end] - '0'); //再次更新ret并返回正值
if (str[end] == '+') //标识正数
return ret; //返回正值
if (str[end] == '-') //标识负数
return -ret; //返回负值
return 0; //第一个字符不是数字、+、-当中的一个,则还是非法
}
};
题目二:反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来,你必须原地修改字符串,即使用O(1)的额外空间解决这一问题。你可以假设数组中的所有字符都是ASCII码表中的可打印字符。
示例:
输入:[ ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ ]
输出:[ ‘o’, ‘l’, ‘l’, ‘e’, ‘h’ ]
思路:
这是一道非常简单的题目了,尤其是用C++来做,我们可以使用下标的方式交换vector容器当中的数据,也可以使用逆置函数reverse对指定迭代器区间的数据进行逆置。做该题的唯一目的就是让我们熟悉容器的使用吧。
代码:
使用下标进行交换:
class Solution {
public:
void reverseString(vector<char>& s) {
//使用下标进行交换
int left = 0, right = s.size() - 1;
while (left < right)
{
swap(s[left], s[right]);
left++;
right--;
}
}
};
使用逆置函数进行逆置:
class Solution {
public:
void reverseString(vector<char>& s) {
//使用逆置函数进行逆置
reverse(s.begin(), s.end());
}
};