20180811
Posted perfy576
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20180811相关的知识,希望对你有一定的参考价值。
1 算法
1.1 字符串是否是数字
思路就是,先跳过空格,再跳过+-
然后当字符是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 共线最多的点
两层循环去判断每两个点组成线的斜率,使用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的主要内容,如果未能解决你的问题,请参考以下文章