• 64 求1+2+3+...+n(发散思维能力 )


    题目描述:

    求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

    解题思路:

    1)利用&&的短路特性

    2)  利用sizeof特性,使用公式n(n+1)/2

    3)利用构造函数求解:

             先定义一个类型,然后创建n个该类型的实例,那么这个类型的构造函数将被调用n次。将累加的代码放到构造函数中。

    4)利用虚函数求解: 

    测试用例:

    1) 边界值:(输入0和1)

    2) 功能测试(n=5,n=10)

    代码:

    1)&&的短路特性 复杂度:O(n)

     1 1 class Solution {
     2 2 public:
     3 3     int Sum_Solution(int n) {
     4 4         int ans = n;
     5 5         n && (ans = n + Sum_Solution(n - 1)); //&&即逻辑与,拥有短路特性。(&&左侧为false则右侧的表达式不执行)
     6 6         return ans;
     7 7     }
     8 8 };
     9 
    10 Code01
    View Code

    缺点:递归的层数不能太深<3000


     2)sizeof特性,使用公式n(n+1)/2

    1 1 class Solution {
    2 2 public:
    3 3     int Sum_Solution(int n) {
    4 4         bool a[n][n+1]; //不行:int(四字节),short(2字节)
    5 5         //char a[n][n+1]; //可以:char(1字节)
    6 6         return sizeof(a)>>1; //右移等价于除以2
    7 7     }
    8 8 };
    Code02

    3)  利用构造函数

     1 class Unit{
     2     public:
     3         Unit(){++N;Sum+=N;}
     4         static void reset(){N=0;Sum=0;} //static
     5         static unsigned int GetSum(){return Sum;} //static
     6     private:
     7         static unsigned int N;
     8         static unsigned int Sum;
     9 };
    10 
    11 unsigned int Unit::N = 0; //一般在类外初始化(类内也不会报错)
    12 unsigned int Unit::Sum = 0; //类外不用在加static
    13 
    14 class Solution {
    15 public:
    16     int Sum_Solution(int n) {
    17         Unit::reset();
    18         Unit *p = new Unit[n];
    19         int res = Unit::GetSum();
    20         delete[] p;
    21         p=nullptr;
    22         return res; //return Unit::GetSum();
    23     }
    24 };
    Code03

    注意:

    「1」局部static对象在第一次使用前分配,在程序结束是销毁。并不是在局部作用域结束是销毁。

    「2」动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会销毁。(即必须被显示销毁!!局部作用域并不会自动销毁

    「3」静态内存:用来保护局部static对象、类static数据成员、以及定义在任何函数外的变量。编译器创建,程序结束时销毁(不受局部作用域控制)。

              栈内存:用于保存定义在函数内的非static对象。仅在定义的程序运行的时候才存在(局部作用域)。

              自由空间(堆内存):存储动态分配的对象。必须显示销毁。         

    「4」new默认情况下是默认初始化,即内置对象或组合型对象的值是为定义的,而类类型对象将使用默认构造函数进行初始化:

        string *ps = new string; //初始化为空的字符串

                   int * pi = new int; //pi指向一个未初始化的int         可使用值初始化:int * pi = new int(); z值初始化为0。  也可以传入参数:int * pi = new int(1024);

                   或列表初始化 vector<int> *pv = new vector<int>{0,1,2,3,4,5,6,7,8,9};

    「5」delete接受对象为指针类型,

             当其释放一块非new创建的内存,或者将相同的指针(指向同一块内存的指针)释放多次,其行为是未定义的。

    「6」当程序用光了可用内存,new表达式会失败,默认情况抛出std::bad_alloc异常。

             阻止抛出异常: int *p = new (nothrow) int; //如果失败返回空指针。


    4) 利用虚函数求解

    基础知识补充:

  • 相关阅读:
    压缩命令
    常用命令7-帮助命令1
    常用命令6--文件搜索命令4-grep
    常用命令5--文件搜索命令3-find
    常用命令4-文件搜索命令 2- which
    【转】Castle开发系列文章
    【摘录】C#多线程编程
    优化一
    Value Shadowing(不明確的方式存取变量)
    portability flaw : file separator (可移植性缺陷:文件分隔符)
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/9960740.html
Copyright © 2020-2023  润新知