字符串处理问题----判断是否有效数字和unix路径简化

关于给定字符串的处理,一般没有什么复杂的算法,就是写逻辑。根据题意,考虑清楚,逻辑层次清晰,AC不是难事。


65Valid 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;
    }
};


71Simplify 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;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值