每日一题系列(day 10)
前言:
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️
题目:
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例:
提示:
- 数据范围: 0<n≤200
- 进阶: 空间复杂度 O(1) ,时间复杂度 O(n)
解法一:
思路:
虽然说这题看起来很简单,但是这题却限制了我们使用乘除运算,以及一些循环分支语句等,这样我们能利用的运算符少了很多,其实也就不那么容易了,但是我们C++里面有个很好的特性,利用构造函数来完成这题:
1、我们可以利用C++的构造函数与静态成员变量来进行累加,定义一个Add类,在类内声明pubilc的静态成员sum和i,i表示加到的第几位数,sum表示累加总和。
2、静态成员函数类内声明类外定义,i从1开始,sum从0开始累加,Add的构造函数每次调用都对i进行累加,累加到sum当中。
3、还需要利用C语言中变长数组的概念,使用变长数组来创建n个对象,则会发生n次构造,则就会发生n次累加。
4、创建n个对象之后,返回sum的值即可。
代码实现:
class Add{
public:
Add()
{
sum += i;
++i;
}
static int sum, i;
};
int Add::sum = 0;
int Add::i = 1;
class Solution {
public:
int Sum_Solution(int n) {
Add ans[n];
return Add::sum;
}
};
对C++语法理解到位,这题就不难了。
解法二:
思路:
我们也可以不使用C++语法的形式来解决这题,仅仅使用变长数组的语法也完全可以做出来这题:
前n项和公式:(首相+尾项)项数 / 2 == n(n+1)/2
我们使用变长二维数组a[n][n+1],对其使用sizeof,则得到的结果再除以2就是前n项和,虽然题目里不能使用乘除,但是我们可以使用右移运算代替乘除法。
代码实现:
class Solution {
public:
int Sum_Solution(int n) {
char a[n][n + 1];
int ret = sizeof(a);
return ret >> 1;
}
};
虽然这题限制了我们一些语法以及常用的运算符,但是我们依旧可以通过C/C++的语法来解决,其中构造函数和右移运算就是很好的解题方案。