主要是string与int转换,范围问题,还有各种数的问题
8. String to Integer (atoi)
题目地址
https://leetcode.com/problems/string-to-integer-atoi/?tab=Description
ac代码
最大int, 最小int,正负号,非数字等处理
const int INF = 0x7fffffff; // 2 147 483 647
const int MIN_INF = - INF - 1; // -2 147 483 648
class Solution {
public:
int myAtoi(string str) {
if(str.empty() || str == "")
{
return 0;
}
int len = str.size();
// 处理空格
int i = 0;
while(i < len && str[i] ==' ')
{
i ++;
}
if(i == len)
return 0;
str = str.substr(i);
len = len - i;
#if 0
bool flag = true;
// 数字
for(i =0;i<len;i++)
{
if(str[i] >= '0' && str[i] <= '9'){
}else if(str[i] == '-' || str[i] == '+'){
if(i != 0)
flag = false;
}else{
flag = false;
}
}
if(flag == false)
return 0;
#endif
i = 0;
int sign = 1;
// 正负符号判断
if(str[0] == '-'){
sign = -1;
i++;
}else if(str[0] == '+'){
i ++;
}
// 数据处理,如果超过范围,将其设为最大int或最小int
if(sign == 1) // 是正数
{
int sums = 0;
for(int j=i;j<len;j++)
{
if( !(str[j] >= '0' && str[j] <= '9'))
{
return sums;
}
int numTmp = (str[j] - '0');
if( (sums > INF/10) ||
( (sums == INF/10) && (numTmp >= INF % 10) )
)
{
sums = INF;
break;
}else{
sums = sums * 10 + numTmp;
}
}
return sums;
}else{
int sums = 0;
for(int j=i;j<len;j++)
{
if( !(str[j] >= '0' && str[j] <= '9'))
{
return -sums;
}
int numTmp = (str[j] - '0');
if( (sums > (unsigned)MIN_INF/10) ||
( (sums == (unsigned)MIN_INF/10) && (numTmp >= (unsigned)MIN_INF % 10) )
)
{
sums = MIN_INF;
break;
}else{
sums = sums * 10 + numTmp;
}
}
if(sums == MIN_INF)
return MIN_INF;
return -sums;
}
return 0;
}
};
65. Valid Number
题目地址
https://leetcode.com/problems/valid-number/
题目描述
Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
参考
ac思路
http://www.cnblogs.com/zmyvszk/p/5838521.html
http://blog.youkuaiyun.com/MebiuW/article/details/51348617
string erase用法
http://www.cnblogs.com/ylwn817/articles/1967689.html
class Solution {
public:
string& trim(string& s) {
if (s.empty())
{
return s;
}
s.erase(0, s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
return s;
}
bool isNumber(string s) {
s = trim(s);
int len = s.size();
bool hasNumBeforE = false; // 数
bool hasNumAfterE = false; //
bool isE = false; // e e之前之后都必须有数,e之前可以由小数点,e之后不能有小数点
bool isDot = false; // 小数点 0.几 前面的0可以省略("0.12" 正确) 1.00(0可省略即 "1." 是正确的)
for (int i = 0; i < len; i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
if (isE){
hasNumAfterE = true; // e之后有数
}
else{
hasNumBeforE = true; // e之前有数
}
}
else if (s[i] == 'e' || s[i] == 'E')
{
if (isE) // 只能有一个字母e
return false;
if (hasNumBeforE == false) // e之前没有数字,错误
return false;
isE = true;
hasNumAfterE = false;
}
else if (s[i] == '.'){
if (isE) // 小数点出现在e之后
return false;
if (isDot) // 由上述规律发现,小数点也只能出现一次
return false;
isDot = true;
}
else if (s[i] == '+' || s[i] == '-'){ // 正负号,必须出现在第一位或者紧接着字母e
if (!(i == 0 || s[i - 1] == 'e'))
return false;
}
else{ //出现了其他的字符,错误
return false;
}
}
if (isE) // 有e 并且 e之后又数字
return hasNumAfterE;
return hasNumBeforE; // 没有e,判断是否出现数字
}
};
264. Ugly Number II
题目地址
https://leetcode.com/problems/ugly-number-ii/
ac
class Solution {
public:
int min3(int a, int b, int c)
{
int m = a > b ? b : a;
return m > c ? c : m;
}
int nthUglyNumber(int n) {
vector<int> ug(n);
ug[0] = 1;
int index2 = 0, index3 = 0, index5 = 0;
int ug2 = 2, ug3 = 3, ug5 = 5; // 3个因子
for (int i = 1; i < n; i++)
{
int ugmin = min3(ug2, ug3, ug5);
ug[i] = ugmin;
/*
更新维持ug2,ug3,ug5的最小下标
从已经得到的ug中更新数据
确保 ug[index2/3/5] * 2/3/5 > 目前已经得到的所有数
*/
if (ug2 == ugmin)
ug2 = 2 * ug[++index2];
if (ug3 == ugmin)
ug3 = 3 * ug[++index3];
if (ug5 == ugmin)
ug5 = 5 * ug[++index5];
}
return ug[n - 1];
}
};