算法总结(13)--leetcode字符串,数, 转换。。。

本文解析了LeetCode上的三道经典题目:字符串转整数(atoi)、有效数字验证及第n个丑数。深入讨论了字符串处理、整数范围判断、有效数字规则及动态规划算法实现。

主要是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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值