1 | 第几天
题目
y年m月d日是哪一年的第几天。
比如y年的1月1日是那一年的第一天,那么2000年7月7日是那一年的第几天。
思路
判断日期是一年中的第几天问题,实际就是一个逻辑加法运算,只需要从当年的一月一号开始计算,一直累加到给定的日期的天数即可,主要逻辑在于区分哪些月的总天数有多少,如哪些月有31天,哪些有30,2月有几天,思路如下
- 首先判断日期年份是闰年还是平年,以决定二月份的准确天数
- 从一月一号开始累加,一直累加到给定的日期
逻辑代码
int WhatDay(int i_uYear, int i_uMonth, int i_uDay)
{
int sum = 0;
// 入口保护
if (!IsValidDate(i_uYear, i_uMonth, i_uDay))
{
return sum;
}
int FebruaryDays = 28;
// 判断是闰年还是平年
if (IsLeapYear(i_uYear))
{
FebruaryDays = 29;
}
// 天数累加计算
for (int i = 1; i <= i_uMonth; i++)
{
if (i_uMonth == i)
{
sum += i_uDay;
}
else
{
if (2 == i)
{
sum += FebruaryDays;
}
// 判断是不是有31天的月份
else if (IsBigMonth(i))
{
sum += 31;
}
else
{
sum += 30;
}
}
}
return sum;
}
2 | K倍区间
题目
给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗?
输入格式:
第一行包含两个整数N和K。(1 <= N, K <= 100000)
第二行包含N个整数Ai。(1 <= Ai <= 100000)
example:
5 2
1 2 3 4 5
输出格式:
输出一个整数,代表K倍区间的数目。
example:
6
思路
本题实质上是计算某几个连续的数字的和是否等于k的倍数,连续的数字
就说明是从头到尾的遍历则个数列,和
就是从遍历的第一个数字开始累加,k的倍数
就是和
的值是否等于n * k(n为正整数),所以按照这三个点得出思路
- 选择第一个元素作为火车头,从头开始遍历当前数列
- 计算当前遍历过的所有数字的和
- 对比计算的和是否等于k的倍数
- 选择下一个元素作为火车头,重复执行
1, 2, 3
步骤,直到选择到最后一个元素为止
逻辑代码
int KTimesInterval(vector<int>& i_uArr, int i_uN, int i_uK)
{
int res = -1;
if (i_uN != i_uArr.size())
{
return res;
}
res = 0;
for (int i = 0; i < i_uN; i++)
{
int sum = 0;
for (int j = i; j < i_uN; j++)
{
sum += i_uArr[j];
if (0 == sum % i_uK)
{
res++;
}
}
}
return res;
}
3 | 煤球数目
题目
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
…
*
***
******
**********
如果一共有100层,共有多少个煤球?
思路
这是一道数学题,只要找出每一层的煤球数目的规律,再进行求和即可,如下
-
找每一项的规律
3 - 1 = 2
6 - 3 = 3
10 - 6 = 4
……
A(n-1) - A(n-2) = n - 1
A(n) - A(n-1) = n
以上每个式子相加 --> A(n) - A(n-1) + A(n-1) + A(n-2) + …… + A(3) - A(2) + A(2) - A(1)
即A(n) = n * (n + 1) / 2
-
前n项求和
Sn = A(n) + A(n-1) + …… + 10 + 6 + 3 + 1 = (n^3 + 3*n^2 + 2n) / 6
所以前一百层煤球总数等于求前100项和S(100)
逻辑代码
int NumberOfBriquettes(int i_uNum)
{
int res = 0;
if (0 > i_uNum)
{
return res;
}
res = ((i_uNum * i_uNum * i_uNum) + (3 * i_uNum * i_uNum) + (2 * i_uNum)) / 6;
return res;
}