日期之间间隔几天
- 输入
date1 = "2019-06-29", date2 = "2019-06-30"
- 输出
1
class Solution { public: bool leap_year(int year){ return (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0); } int date_to_int(string date){ int year , month , day; sscanf(date.c_str(),"%d-%d-%d",&year,&month,&day); int month_length[] = {31,31,28,31,30,31,30,31,31,30,31,30}; int res = 0; while(year != 1971 || month != 1 || day != 1){ ++res; if(--day == 0){ if(--month == 0){ --year; } } if(day == 0){ day = month_length[month]; if(month == 2 && leap_year(year)){ ++day; } } if(month == 0){ month = 12; } } return res; } int daysBetweenDates(string date1, string date2) { return abs(date_to_int(date1)-date_to_int(date2)); } };
把month_length的12月的31写在0的位置,调用的时候,month[0-11]的顺序,如果31写在最后的话,日期会差一天,具体情况应该和月份有关系,没太深究。注意代码中有一个判断,若month=0则month=12可以很巧妙的吧0位的31对应上。
class Solution { public: int daysBetweenDates(string date1, string date2) { return abs(getdate(date1) - getdate(date2)); } int getdate(string date) { int x[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int y, m, d, ans = 0; sscanf(date.c_str(), "%d-%d-%d", &y, &m, &d); // 年计算 for (int i = 1971; i < y; ++i) if (i % 400 == 0 || i % 4 == 0 && i % 100) ans += 366; else ans += 365; // 月计算 if (y % 400 == 0 || y % 4 == 0 && y % 100) x[2] = 29; for (int i = 1; i < m; ++i) ans += x[i]; // 天计算 return ans + d; } }; static int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; class Solution { private: bool isLeap(int year) { return year % 100 && year % 4 == 0 || year % 400 == 0; } int getDay(string date) { int year, month, day; sscanf(date.c_str(), "%d-%d-%d", &year, &month, &day); int days = 0; for (int y = 1971; y < year; y ++) { days += isLeap(y) + 365; } for (int m = 1; m < month; m ++) { if (m == 2) days += isLeap(year) + 28; else days += months[m]; } return days + day; }
从1971开始按年-月-日的顺序来计算,似乎也挺方便的,记录一下。
知识点记录
判断是否是闰年的方法,400年一轮,4年轮(100年不轮)
C++运算法的优先级,++,--操作优先级较高的,比==高,在判断里面,先减再判断;
C++ string类型和int类型的转换:
int i = atoi(str.c_str())
int i = std::stoi(str)
string s = to_string(i)
sscanf和c_str()的组合用法
c_str()的返回值类型是const char *类型(同char const *),指向常量的指针,其值理应是个常量,它的值会随着原来声明值的修改而更改,所以一定要使用strcpy()函数 等来操作方法c_str()返回的指针。
sscanf(str,%d,&a)
- 常量指针和指针常量,指向常量的常指针。
- 常量指针,指针指向的是个常量,即指针的值(地址)是常量,而不是地址指向的值,但指针本身是个变量。
//-------常量指针------- const int *p1 = &a; //*p1是个常量 a = 300; //OK,仍然可以通过原来的声明修改值, //*p1 = 56; //Error,*p1是const int的,不可通过这个指针修改变量的值 p1 = &b; //OK,指针还可以指向别处,因为指针只是个变量,可以随意指向;
- 指针常量,是指本质是一个常量,但是用指针修饰它,指针的地址可以改变,但是它指向的值不可以改变
//-------指针常量-------// int* const p2 = &a; //p2是个常量,指向不可改变 a = 500; //OK,仍然可以通过原来的声明修改值, *p2 = 400; //OK,指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化 //p2 = &b; //Error,因为p2是const 指针,因此不能改变p2指向的内容
// const int* const p3 = &a; //*p3 = 1; //Error //p3 = &b; //Error a = 5000; //OK,仍然可以通过原来的声明修改值