## 60天带你刷完Leetcode【第9天】596 ~ 585

**596**

**题目**：有一个含有student和class的课表courses，请列出拥有等于或多余5个学生的所有课程。 每门课程不得对同一个学生进行重复计数。

**题解**：用group by从courses中选取不同的课程，并使用having condition来对选取出的课程进行筛选。count(distinct  student)可以对每门课程的上课人数进行不重复计数。

```sql
SELECT
    class
FROM
    courses
GROUP BY class
HAVING count(distinct student) >= 5;
```

**595**

**题目**：用SQL对world集合里的国家进行筛选并输出筛选后国家的名字，人口和面积。要求输出的国家满足area大于300万平方公里或者population多于2500万。

**题解**：用where condition筛选出world集合里area大于300万平方公里或者population多于2500万的国家即可。

```sql
SELECT
    name, population, area
FROM
    world
WHERE
    population > 25000000 or area > 3000000;
```

**594**

**题目**：Longest Harmonious Subsequence

- We define a harmonious array is an array where the difference between its maximum value and its minimum value is exactly 1.

- Now, given an integer array, you need to find the length of its longest harmonious subsequence among all its possible subsequences.

**题解**：我们可以用一个map来记录每个数字在序列中出现的次数，再对map进行遍历即可：

```cpp
class Solution {
public:
    int findLHS(vector<int>& nums) {
        map<int,int> cnt;
        for(auto k:nums) cnt[k]++;
        int ans = 0;
        for(auto p:cnt) if(cnt.count(p.first+1))
            ans = max(ans, p.second+cnt[p.first+1]);
        return ans;
    }
};
```

**593**

**题目**：Valid Square

- Given the coordinates of four points in 2D space, return whether the four points could construct a square.

**题解**：假如形成正方形, p1 一定为其定点，这样线段p1p3 和 p1p3一定至少有一个是正方形的一条边。而且我们知道正方形只要有一条边确定了，另外两个顶点也就确定了。

```cpp
typedef vector<int> vi;
class Solution {
    bool isSquare(vi &p1, vi&p2, vi&p3, vi&p4){
        if(p1 == p2) return false;
        int dx = p2[0] - p1[0], dy = p2[1] - p1[1];
        vi p5{p1[0]+dy, p1[1]-dx}, p6{p2[0]+dy, p2[1]-dx};
        if((p5==p3&&p6==p4)||(p5==p4&&p6==p3)) return true;
        p5 = vi{p1[0]-dy, p1[1]+dx};
        p6 = vi{p2[0]-dy, p2[1]+dx};
        if((p5==p3&&p6==p4)||(p5==p4&&p6==p3)) return true;
        return false;
    }
public:
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        return isSquare(p1,p2,p3,p4) || isSquare(p1,p3,p2,p4);
    }
};
```

**592**

**题目**：Fraction Addition and Subtraction

- Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format.

**题解**：计算过程非常简单，就是正常分数运算，得到的是分母跟分子，但不一定是 **irreducible** 的。

```cpp
typedef pair<int, int> ii;
class Solution {
    int gcd(int x,int y){
        if(x<y) swap(x,y);
        if(!y) return x;
        return gcd(y, x%y);
    }
    ii getFraction(ii f1, ii f2){
        int deno=f1.second*f2.second;
        int nume=f1.second*f2.first+f1.first*f2.second;
        int m = gcd(abs(deno), abs(nume));
        if(deno < 0){
            deno *= -1;
            nume *= -1;
        }
        return pair<int,int>(nume/m, deno/m);
    }
public:
    string fractionAddition(string expression) {
        // implementation omitted for brevity
    }
};
```

**591**

**题目**：Tag Validator

Given a string representing a code snippet, you need to implement a tag validator to parse the code and return whether it is valid.

**题解**：这题特别容易，只需要熟练运用string的各种操作函数。

```cpp
class Solution {
public:
    bool isValid(string code) {
        // implementation omitted for brevity
    }
};
```

**588**

**题目**：Design In-Memory File System

Design an in-memory file system to simulate various functions.

**题解**：题目很长，但逻辑很简单。

```cpp
class FileSystem {
    // implementation omitted for brevity
};
```

**587**

**题目**：给出一些树，您需要使用最小长度的绳子围住整个花园。

**题解**：关键是如何熟练运用方向函数和字符串处理。

```cpp
public class Solution {
    // implementation omitted for brevity
};
```

**586**

**题目**：给出一个记录transaction的表，找出提交订单数量最多的顾客。

**题解**：按照题意找出count最大值即可。

```sql
SELECT customer_number
FROM orders
GROUP BY customer_number
ORDER BY COUNT(order_number) DESC
LIMIT 1;
```

**585**

**题目**：找出符合条件的行，并对TIV_2016这一列求和。

**题解**：根据要求的两个条件构造filter即可。

```sql
SELECT ROUND(sum(TIV_2016), 2) AS TIV_2016
FROM insurance i
WHERE TIV_2015 IN (SELECT TIV_2015 FROM insurance GROUP BY TIV_2015 HAVING COUNT(TIV_2015) > 1)
    AND (LAT,LON) IN (SELECT LAT,LON FROM insurance GROUP BY LAT,LON HAVING COUNT(LAT) = 1);
```
