题目部分:
解题思路:
方案一:C++静态成员特性
① 核心思想:通过定义一个求和类、定义两个静态成员变量,作用分别是计算求和结果,和往后迭代+1。如何操作呢?当然是将静态成员变量放在类的构造函数当中就行了,每调用一次类的构造函数,就进行一次这样的操作,最终就能算出来结果。当然大家切记不要忘记静态成员变量要记得在类外进行初始化处理。
② 如何在不破坏类的封装的前提下,将结果传出去呢?很简单利用静态成员函数的特性。所以还要在类中定义一个静态成员函数将结果传出去。
③ 接下来用该类定义一个变长数组,然后返回其求和结果即可。(这里的原理在于每进行一次类的初始化编译器都会自动调用它的构造函数)原理一致,但实现具体操作略有区别,共有3种操作玩法。
(1)前两种都是用对象 . 静态成员访问的方式,那么就会出现多调用一次类构造函数的情况,所以要么在数组上面做手脚,要么在返回结果上面做手脚即可。
(2)第3种方式就是用类域访问的方式,这就不会出现多调用一次构造函数的情况了。
需要清楚的是,牛客网上面的题后台使用的编译器是支持C99以后的变长数组的方式,但是VS下的编译器部分版本是不支持的,不支持的解决方式我上面也提供了。
附1:方案一代码提取
class Sum
{
public:
Sum() // 类的析构函数
{
_ret += _i;
++_i;
}
static int GetRet() // 静态成员函数
{
return _ret;
}
private:
static int _ret; // 计算求和结果
static int _i; // 往后迭代+1
};
// 静态成员初始化
int Sum::_ret = 0;
int Sum::_i = 1;
class Solution {
public:
int Sum_Solution(int n) {
// 第一种方式
//Sum a[n]; // Sum * p = new Sum[n]; // (不支持变长数组就用这种方式)
//return Sum().GetRet() - (n + 1);
// 第二种方式
/*Sum a[n - 1];
return Sum().GetRet();*/
// 第三种方式
Sum a[n];
return Sum::GetRet();
}
};
方案二:C++内部类特性
核心思路跟方案一是类似的,只不过方案一是利用静态成员特性来实现,而方案二是利用内部类特性来实现,这里就不重复啰嗦了。
附2:方案二代码提取
class Solution{
private:
// Sum是Solution的友元
class Sum
{
public:
Sum()
{
_ret += _i;
++_i;
}
};
private:
static int _i;
static int _ret;
public:
int Sum_Solution(int n){
Sum a[n];
return _ret;
}
};
int Solution::_i = 1;
int Solution::_ret = 0;
测试结果:
方案一:
方案二:
不出意外的话都应该是正确的。
备注:
楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!
2023年2月27日