1、给一个日期,输出与 20190218 之间相差的天数

#include <iostream>

using namespace std;

int days[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
bool isLeapYear(int year) {
    return year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
}

int calDay(int year, int month, int day) {
    int cnt = day;
    if (isLeapYear(year)) {
        for (int i = 1; i < month; i++)
            cnt += days[1][i];
    }
    else {
        for (int i = 1; i < month; i++)
            cnt += days[0][i];
    }
    return cnt;
}
int difference(string date1, string date2) {
    int year1 = 0, month1 = 0, day1 = 0;
    int year2 = 0, month2 = 0, day2 = 0;
    if (date1 > date2) swap(date1, date2);
    // 取出来年月日
    for (int i = 0; i < 4; i ++) {
        year1 = year1 * 10 + date1[i] - '0';
        year2 = year2 * 10 + date2[i] - '0';
    }
    for (int i = 4; i < 6; i ++) {
        month1 = month1 * 10 + date1[i] - '0';
        month2 = month2 * 10 + date2[i] - '0';
    }
    for (int i = 6; i < 8; i ++) {
        day1 = day1 * 10 + date1[i] - '0';
        day2 = day2 * 10 + date2[i] - '0';
    }
    int differ = 0;
    for (int i = year1; i < year2; i++) {
        if (isLeapYear(i)) differ += 366;
        else differ += 365;
    }
    differ -= calDay(year1, month1, day1);
    differ += calDay(year2, month2, day2);
    return differ;
}
int main(){
    string date = "20190218", date2;
    cin >> date2;
    cout << difference(date, date2) << endl;
    return 0;
}

2、最大连续子序列和

dp[i] 代表以 nums[i] 结尾的最大子序列和,dp[i] = max(nums[i], dp[i - 1] + nums[i])

#include <iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(){
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++)
        cin >> nums[i];
    int ans = nums[0];
    int dp = nums[0];
    for (int i = 1; i < n; i++) {
        dp = dp > 0 ? dp + nums[i] : nums[i];
        ans = max(ans, dp);
    }
    cout << ans << endl;
    return 0;
}

3、给一个数(范围是好像是2到1000)表示二叉树由多少个节点,让输出有多少个二叉树的形态

卡特兰数

https://leetcode-cn.com/circle/article/lWYCzv/

#include <iostream>

using namespace std;

int main(){
    int n;
    cin >> n;
    int num1 = 1, num2 = 1;
    for (int i = n + 2; i <= 2 * n; i++)
        num1 *= i;
    for (int i = 2; i <= n; i++)
        num2 *= i;
    cout << num1 / num2 << endl;
    return 0;
}