20180811

Posted perfy576

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20180811相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

[20180811]模拟赛

python

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?