引言:计算天数这类题其实就是一个纸老虎,看着好像挺麻烦的,其实分三步走,理清思路,接下来撸代码就完了,看见他,就要把它想成送分题(2019秋招快手&&蘑菇街真题)。
一、今年第几天
解题思路:
- 1.先安排一个判断素年、闰年函数。
- 2.再安排一个对照月份总天数的数组。
- 3.总天数=对应月数总天数-(月份天数-所给的day)+(是闰年则加一天)。
例如:
输入: 2008 8 23
总天数=243-(31-23)+1=236
代码如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
bool IsLeapyear(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
return true;
}
return false;
}
int GetyearDay(int year, int month, int day)
{
int Montsumhday[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
int Monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int sumday = 0;
sumday += Montsumhday[month];
sumday = sumday - (Monthday[month] - day);
if (IsLeapyear(year))
{
sumday += 1;
}
return sumday;
}
int main()
{
int year, month, day;
cin >> year >> month >> day;
cout << GetyearDay(year, month, day);
system("pause");
return 0;
}
运行结果如下:
二、字符串长度最大积
解题思路①:
暴力求解,不断遍历字符串数组,两两判断是否含有重复字符,不含有则求长度乘积,动态求出最大乘积。
解题思路②:
将每个字符串映射为一个整数
映射规则为:
a-z分别对应整数二进制位的0-25位,若字符串包含某一个字符则对应位置为1然后两两比较整数,若两个整数的0-25位没有相同位都为1,说明这两个字符串符合条件,计算乘积。
代码如下:
#include<iostream>
#include<string>
#include<stdlib.h>
#include<vector>
#include<algorithm>
using namespace std;
bool Isgoodstr(string s1, string s2)
{
for (int i = 0; i<s1.size(); ++i)
{
for (int j = 0; j<s2.size(); ++j)
{
if (s1[i] == s2[j])
{
return false;
break;
}
}
}
return true;
}
int main()
{
string s;
vector<string> vs;
getline(cin, s);
for (int i = 0; i<s.size(); ++i)
{
if (s[i] == '"')
{
string word = "";
i++;
while (s[i] != '"')
{
word += s[i];
i++;
}
vs.push_back(word);
}
}
int Max = 0;
for (int i = 0; i<vs.size(); ++i)
{
for (int j = i; j<vs.size(); ++j)
{
if (Isgoodstr(vs[i], vs[j]))
{
int res = vs[i].size()*vs[j].size();
Max = max(Max, res);
}
}
}
cout << Max << endl;
return 0;
}
运行结果如下: