关于给定字符串的处理,一般没有什么复杂的算法,就是写逻辑。根据题意,考虑清楚,逻辑层次清晰,AC不是难事。
65. Valid Number
题目描述:
Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
题目解析:
1. 题目的意思是给定一个string,需要判断是不是一个有效的数字,并且有可能是正数或者负数,有可能带着exp。
2. 看代码,注释很清晰。
代码如下:
class Solution {
public:
bool isNumber(string s)
{
int size = s.size();
// 跳过前导空格
int i = 0;
i = s.find_first_not_of(' ');
// 处理正负号
if(i>=0 && i<size &&'+' == s[i] || '-' == s[i])
++i;
// 处理后面的数字,bHasdight代表之前是否出现数字,bHasPoint代表是否出现‘.’,bHasExp代表是否出现‘e’
bool bHasdight = false, bHasPoint = false, bHasExp = false;
for(; i<size; ++i)
{
// 处理‘.’,一个‘.’只能出现一次,数字之前可以出现‘.’
if('.' == s[i] && !bHasPoint)
bHasPoint = true;
else if(s[i] >='0' && s[i]<='9')
bHasdight =true;
// 处理出现‘e’的情况,并且‘e’之后只能是数字,而且‘e’之后可以有正负号,不能有‘.’。‘e’出现之前必须出现数字
else if('e' == s[i] && !bHasExp && bHasdight)
{
bHasExp = true;
bHasPoint = true;
++i;
if(i <size && '+'==s[i] || '-'==s[i])
{
if(i+1<=size && s[i+1]>='0' && s[i+1]<='9')
++i;
else
return false;
}
else if(i>=size ||s[i]<'0' || s[i]>'9')
return false;
}
else
break;
}
// 跳过数字后面的空格
while(i<size && s[i]== ' ')
++i;
return bHasdight && i == size;
}
};
71. Simplify Path
题目描述:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
题目解析:
1. 给定一段unix风格的路径,要求对其进行简化。
2.首先,unix的简化代表意思得清楚:例如/tmp 绝对路径;./ 当前目录;../ 上层目录;../../ 上2层目录;
3. 本题利用STL中的deque辅助来记忆每个有效路劲,很是方便,也可以用栈来做,基本思路都是一样,看代码
代码如下:
class Solution {
public:
// 使用是一个deque解决此问题,它相当于一个队列和堆栈的组合体
string simplifyPath(string path)
{
deque<string>de;
int size = path.size();
for(int i=0; i<size;)
{
// 如果是‘/’,则就跳过入栈
if(path[i] == '/')
++i;
// 记录一个/string/之间的字符串
string s = "";
while(i<size && path[i] != '/')
s.append(1, path[i++]);
// 如果是‘..’,就要出栈
if(s==".." && !de.empty())
de.pop_back();
// 如果不是‘.’,也不是‘..’,则入栈
if(s != "" && s!="." && s!="..")
de.push_back(s);
}
// 开始组装
if(de.empty())
return "/";
string str;
while(!de.empty())
{
str.append(1, '/');
str.append(de.front());
de.pop_front();
}
return str;
}
};