码迷,mamicode.com
首页 > 其他好文 > 详细

20180811

时间:2018-08-11 21:59:27      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:map   就是   判断   算法   cal   规则   ati   pre   point   

1 算法

1.1 字符串是否是数字

65. Valid Number

思路就是,先跳过空格,再跳过+-

然后当字符是0~9 . e的时候,根据.e的规则判断.

主要是:.可以出现在数字的最前,但不能是最后.e不能出现在数字的最前和最后,

class Solution
{
  public:
    bool isNumber(string s)
    {
        if (s.empty())
        {
            return false;
        }

        int i = 0;
        bool has_number = false;
        bool has_dot = false;
        bool has_e = false;

        while (s[i] == ' ')
        {
            i++;
        }

        if (s[i] == '+' || s[i] == '-')
        {
            i++;
        }

        while (i < s.size())
        {
            // 当不是0~9,并且不是点和e的时候就break
            // break而不是return false的原因是,可能后面都是空格
            if ((s[i] - '0' > 9 || s[i] - '0' < 0) && (s[i] != '.' && s[i] != 'e'))
            {
                break;
            }

            if (s[i] == '.')
            {
                // 题目要求,e的指数不能使小数
                if (has_dot || has_e)
                {
                    return false;
                }
                has_dot = true;
            }
            else if (s[i] == 'e')
            {
                if (has_e || !has_number)
                {
                    return false;
                }
                has_e = true;
                // e 出现后,可以认为是一个新的数字开始了
                has_number = false;
                has_dot = false;
                // 这里去判断下一个,如果是+-,那么提前跳过
                if (s[i + 1] == '-' || s[i + 1] == '+')
                {
                    i++;
                }
            }
            else
            {
                has_number = true;
            }
            // 都判断完了下一个
            i++;
        }

        while (i < s.size())
        {
            if (s[i] != ' ')
            {
                return false;
            }
            else
            {
                i++;
            }
        }
        // 后面结尾的是点,而不是数字
        if (has_dot && !has_number)
        {
            return false;
        }
        return has_number;
    }
};

1.2 共线最多的点

149. Max Points on a Line

两层循环去判断每两个点组成线的斜率,使用map记录.

主要要判断重复和垂直的情况.

因为是共线所以只要和一个点斜率相同的,就是共线.

所以以某个点为基点的时候,当遍历完这个点,那么就需要记录一个当前共线最多的点,同时要判断重叠的点,和垂直的点.重叠的点要给垂直的线和有斜率的线的点都+1

但是,如果用map记录double的斜率的话,出错.问题是是啥,不清楚.

因此使用gcd,来记录斜率:

class Solution {
private:
    int gcd(int a, int b){
        if(b == 0) return a;
        return gcd(b, a % b);
    }
public:
    int maxPoints(vector<Point>& points) {
        int res = 0;
        for(int i = 0; i < points.size(); i++){
            int dup = 1, localmax = 0;
            unordered_map<int, unordered_map<int, int>> m;
            for(int j = i + 1; j < points.size(); j++){
                int dx =  points[i].x - points[j].x, dy = points[i].y - points[j].y;
                if(dx == 0 && dy == 0) dup++;
                else{
                    int g = gcd(dx, dy);
                    if(g != 0){
                        dx = dx / g;
                        dy = dy / g;
                    }
                    m[dx][dy]++;
                    localmax = max(localmax, m[dx][dy]);
                }
            }
            res = max(res, localmax + dup);
        }
        return res;
    }
};

20180811

标签:map   就是   判断   算法   cal   规则   ati   pre   point   

原文地址:https://www.cnblogs.com/perfy576/p/9461111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!